Wir verschieben unsere Datenbank vom Webserver auf einen separaten Server (von einem Amazon EC2-Webserver zu einer RDS-Instanz).
Wir haben ein LOAD DATA INFILE, das vorher funktioniert hat, das LOCAL-Schlüsselwort muss jetzt hinzugefügt werden, da sich die Datenbank auf einem anderen Computer als der Webserver befindet.
Beim Testen auf meinem Dev-Server stellt sich heraus, dass es nicht funktioniert:
Zwischen diesen beiden Dingen, die funktionieren, ist Folgendes ausgeschlossen:
Der Fehler, den ich bekomme, ist: ERROR 1148 (42000): Der verwendete Befehl ist bei dieser MySQL-Version nicht erlaubt (Ich erhalte diesen Fehler von der mysql-Befehlszeile, wenn ich nicht --local_infile = 1) verwende
Ein paar andere relevante Informationen:
Aus diesem Grund benötigt der Befehl connect einen zusätzlichen Flagsatz:
%Vor%mysql.allow_local_infile = On
zu bestätigen.
Das einzige, was ich über das gelesen habe, ist, dass ich mysql server auf meinem dev-server mit dem Flag kompiliert habe, um local infile zuzulassen ... aber selbst wenn ich das auf meinem dev-server bekomme, ist es das werde mir bei Amazon RDS nicht helfen. (Abgesehen davon funktioniert LOAD DATA LOCAL INFILE auch von der mysql-Kommandozeile aus.)
Es scheint, als wäre es speziell ein Problem mit mysql_connect () von php
Wer benutzt LOAD DATA LOCAL INFILE (vielleicht von Amazon RDS), das den Trick dafür kennt, dass das funktioniert?
Ich habe das aufgegeben, weil ich denke, dass es ein Bug in PHP ist - insbesondere der mysql_connect-Code, der jetzt veraltet ist. Es könnte wahrscheinlich gelöst werden, indem man PHP selbst mit Änderungen an der Quelle kompiliert, indem man ähnliche Schritte wie in dem Fehlerbericht verwendet, den @eggyal erwähnt: Ссылка
Stattdessen werde ich es umgehen, indem ich einen Aufruf von system () mache und die mysql-Befehlszeile verwende:
%Vor%Das funktioniert für mich.
Wie in dieser Beitrag erwähnt Das Hinzufügen von 3. und 4. Parameter zu mysql_connect wird benötigt, um LOAD LOCAL DATA INFILE arbeiten zu lassen. Es hat mir geholfen. Irgendwelche anderen Vorschläge (apparmor, local-infile = 1 in my.cnf, die im Internet weit diskutiert wurden) haben nicht geholfen. Nach PHP-Code funktioniert für mich!
%Vor%Richtig, dies ist auch im Handbuch .
Hier ist eine Checkliste, um diesen ekligen Bug auszuschließen:
1- Gewähren Sie den Benutzer FILE-Privilegien in MySQL, phpMyAdmin deckt dieses Privileg im allgemeinen nicht ab:
%Vor%2- Bearbeiten Sie my.cnf in / etc / mysql / oder Ihrem mysql Pfad:
%Vor%3- In der php.ini unter / etc / php5 / cli / oder ähnlich:
%Vor% Optional können Sie ini_set
in Ihrem Skript ausführen:
4- Die Datenbank-Handler-Bibliothek muss die richtigen Optionen verwenden.
PDO :
mysqli :
%Vor%5- Stellen Sie sicher, dass der INFILE-Befehl den absoluten Pfad zur Datei verwendet und dass er existiert:
%Vor%6- Überprüfen Sie, ob die Zieldatei und das übergeordnete Verzeichnis von PHP und von MySQL lesbar sind.
%Vor% 7- Wenn Sie lokal arbeiten, können Sie LOCAL
von Ihrem SQL entfernen:
Anstelle von:
%Vor%Hinweis: Denken Sie daran, die MySQL- und PHP-Dienste neu zu starten, wenn Sie ihre Konfigurationsdateien bearbeiten.
Hoffe das hilft jemandem.
Verwenden Sie die folgende Zeile, die der Client mit der Eingabe "true
" aktiviertmysql --local-infile = 1 -u Wurzel -p
Tags und Links php mysql amazon-rds load-data-infile