LOAD DATA LOCAL INFILE schlägt fehl - von php zu mysql (auf Amazon rds)

7

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:

  • Ich kann DATA INFILE immer noch von PHP laden, wie ich
  • war
  • Ich kann DATA LOCAL INFILE von mysql commandline (mit --local_infile = 1)
  • laden
  • Ich kann DATA LOCAL INFILE nicht von PHP laden.

Zwischen diesen beiden Dingen, die funktionieren, ist Folgendes ausgeschlossen:

  • Probleme mit dem SQL- oder PHP-Code
  • Probleme mit der Upload-Datei, einschließlich Syntax und Dateiberechtigungen
  • mysql Servereinstellungen Probleme

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:

  • Ubuntu 12.04, mysql 5.5.24, php 5.3.10
  • Ich benutze PHPs mysql_connect (anstelle von mysqli, weil wir den facebook-Hiphop-Compiler verwenden wollen, der mysqli nicht unterstützt.)
  • Aus diesem Grund benötigt der Befehl connect einen zusätzlichen Flagsatz:

    %Vor%
  • Ich habe phpinfo () verwendet, um mysql.allow_local_infile = On zu bestätigen.
  • Ich habe es auf Amazon RDS versucht (falls es ein Problem in meinem Dev-Server war) und es funktioniert auch nicht dort. (Mit dem Parameter local_infile aktiviert.)

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?

    
Redzarf 22.10.2012, 17:42
quelle

4 Antworten

9

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.

    
Redzarf 23.10.2012, 12:20
quelle
5

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 .

    
Kristjan Adojaan 09.02.2013 15:44
quelle
5

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:

%Vor%

4- Die Datenbank-Handler-Bibliothek muss die richtigen Optionen verwenden.
PDO :

%Vor%

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:

%Vor%

Anstelle von:

%Vor%

Hinweis: Denken Sie daran, die MySQL- und PHP-Dienste neu zu starten, wenn Sie ihre Konfigurationsdateien bearbeiten.

Hoffe das hilft jemandem.

    
pachanka 05.01.2014 23:58
quelle
2

Verwenden Sie die folgende Zeile, die der Client mit der Eingabe "true

" aktiviert

mysql --local-infile = 1 -u Wurzel -p

    
user2408935 22.05.2013 09:48
quelle