2013-04-29 8 views
22

Ich bin mir nicht ganz sicher, dass eine ähnliche Frage damit geschlossen wurde, indem ich versuche, das folgende MySQL-Programm auszuführen.Wie kann ich MySQL Load Error korrigieren?

mysql -e "load data local infile \ 
'/tmp/ept_inventory_wasp_export_04292013.csv' into \ 
table wasp_ept_inv fields terminated by ',' \ 
lines terminated by '\n' ;" 

in der Befehlszeile bash und nutzen Sie diesen Fehler

ERROR 1148 (42000) at line 1: The used command is not allowed with this MySQL version

Wie kann ich dieses Problem umgehen?

Ich führe diesen Befehl tatsächlich von einem Python-Programm aus, aber zog den Befehl heraus, um zu versuchen, an der Bash-Befehlszeile mit ihm zu fummeln.

Ich habe gesehen, wie ich meine.cnf (local-infile) ändern kann, aber ich möchte nicht, dass global eine Änderung, wenn ich es vermeiden kann.

Hier ist die MySQL-Version.

mysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

Antwort

29

Wie unter Security Issues with LOAD DATA LOCAL dokumentiert:

mit diesen Problemen fertig zu werden, wir geändert, wie LOAD DATA LOCAL ab MySQL 3.23.49 und MySQL 4.0.2 (4.0.13 unter Windows) behandelt wird :

  • Standardmäßig werden alle Clients und Bibliotheken MySQL in binär-Distributionen werden mit der --enable-local-infile Option kompiliert werden kompatibel mit MySQL 3.23.48 und vorher.

  • Wenn Sie MySQL aus dem Quellcode bauen, sondern ruf nicht configure mit der Option --enable-local-infile, LOAD DATA LOCAL kann nicht von jedem Client verwendet werden, wenn es ausdrücklich mysql_options(... MYSQL_OPT_LOCAL_INFILE, 0) aufzurufen geschrieben wird. Siehe Section 20.6.6.49, “mysql_options().

  • Sie können alle LOAD DATA LOCAL-Anweisungen serverseitig deaktivieren, indem Sie mysqld mit der Option --local-infile=0 starten.

  • Für den mysql Kommandozeilen-Client aktivieren LOAD DATA LOCAL durch die --local-infile[=1] Option angeben, oder es mit der --local-infile=0 Option deaktivieren. Für mysqlimport ist das Laden der lokalen Datendatei standardmäßig deaktiviert. Aktivieren Sie es mit der --local oder -L Option. In jedem Fall erfordert die erfolgreiche Verwendung einer lokalen Ladeoperation, dass der Server dies zulässt.

  • Wenn Sie LOAD DATA LOCAL in Perl-Skripte oder andere Programme verwenden, die die [client] Gruppe von Optionsdateien lesen, können Sie die Option local-infile=1 zu dieser Gruppe hinzuzufügen.Doch um dies zu verhindern, Probleme für Programme verursachen, die nicht local-infile verstehen, geben sie die loose- Präfix:

     
    [client] 
    loose-local-infile=1 
    
  • Wenn LOAD DATA LOCAL deaktiviert ist, entweder auf dem Server oder dem Client, ein Client, der zur Ausgabe versucht eine solche Aussage erhält die folgende Fehlermeldung:

    ERROR 1148: The used command is not allowed with this MySQL version

+1

Das hilft mir überhaupt nicht. Ich möchte einen Workaround. Und ich habe local-infile in my.cnf gesetzt, und das hat den Fehler nicht geändert. Ich starte MySQL mit den bei der Installation bereitgestellten Anweisungen. Ich mache nichts besonderes. Ihre Antwort bietet immer noch keine Problemumgehung, weil ich nichts speziell deaktiviert habe. – octopusgrabbus

+0

@octopusgrabbus wenn es dir überhaupt nicht hilft, warum hast du dann die Antwort akzeptiert? Warum hast du deine eigene Antwort nicht akzeptiert? – TMS

0

Meine Vermutung ist, dass Ihr MySQL-Server LOAD DATA LOCAL nicht aktiviert hat. Siehe diesen Abschnitt der MySQL-Dokumentation:

Wenn LOAD DATA LOCAL deaktiviert ist, entweder auf dem Server oder dem Client, ein Client, der eine solche Aussage zu erteilen versucht erhält die folgende Fehlermeldung:

ERROR 1148: der verwendete Befehl ist nicht mit dieser MySQL-Version erlaubt ist

Hier Link zu der Seite ich habe dies aus:

http://dev.mysql.com/doc/refman/5.5/en/load-data-local.html

für diesen
45

Die Abhilfe ist die Befehlszeile mysql -e passiert im --local-infile=1 Argumente wie folgt zu ändern:

mysql --local-infile=1 -u username -p ` 

Dann wieder den LOAD DATA LOCAL INFILE Befehl ausführen.

7

local-infile muss sowohl auf dem Server als auch auf dem Client aktiviert sein. Sie können dies erreichen, indem Sie local-infile = 1 zu dem entsprechenden Abschnitt in der my.cnf (Unix) oder my.ini (Windows) Datei jedes Endes hinzufügen. Zum Beispiel auf dem Client:

[client] 
local-infile = 1 

Sie können dies auch zur Laufzeit auf dem Server aktivieren, indem Sie die Systemvariable local_infile Einstellung:

SET GLOBAL local_infile=1; 

Allerdings müssen Sie noch auf dem Client ermöglichen. Sie können durch Hinzufügen einer Befehlszeilenparameter an den mysql Befehl diese zur Laufzeit tun:

mysql --local-infile=1 ... 

Wenn Sie Dienstleistungen Amazon Web RDS verwenden, können Sie die Servereinstellung durch Bearbeitung konfigurieren oder eine Parametergruppe zu schaffen. Suchen Sie nach dem Parameter local_infile. Möglicherweise müssen Sie Ihren Server nach dem Anwenden der Änderungen neu starten.

+1

'SET local_infile = 1;' wird in neueren MySQL-Versionen fehlschlagen. –

+1

SET GLOBAL local_infile = 1; hat für mich gearbeitet. – Minkymorgan

+0

@Minkymorgan Danke, aktualisiert. – Zenexer