MySQL: LOAD DATA LOCAL INFILE aktivieren

127

Ich verwende MySQL 5.5 unter Ubuntu 12 LTS. Wie soll ich LOAD DATA LOCAL INFILE in my.cnf aktivieren?

Ich habe versucht, an verschiedenen Stellen local-infile in meine Konfiguration einzufügen, erhalte jedoch weiterhin die Meldung "Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig."

Krt_Malta
quelle

Antworten:

197

Aus der MySQL 5.5-Handbuchseite:

LOCAL funktioniert nur, wenn sowohl Ihr Server als auch Ihr Client so konfiguriert wurden, dass dies zulässig ist. Wenn mysqld beispielsweise mit --local-infile = 0 gestartet wurde, funktioniert LOCAL nicht. Siehe Abschnitt 6.1.6, „Sicherheitsprobleme mit LOAD DATA LOCAL“.

Sie sollten die Option einstellen:

local-infile=1

in Ihren [mysql] -Eintrag der Datei my.cnf oder rufen Sie den mysql- Client mit der Option --local-infile auf :

mysql --local-infile -uroot -pyourpwd yourdbname

Sie müssen sicherstellen, dass derselbe Parameter auch in Ihrem Abschnitt [mysqld] definiert ist , um die Server-Seite "local infile" zu aktivieren.

Es ist eine Sicherheitsbeschränkung.

dAm2K
quelle
4
Vielen Dank. Übrigens befindet sich der my.cnfPfad /etc/mysql/my.cnfin meinem Computer (AWS EC2).
SparkAndShine
Interessanterweise befand sich die Datei my.cnf für mich im Verzeichnis / etc.
SgtRock
Irgendwelche Ideen, wohin man gehen soll, wenn dies immer noch fehlschlägt. Ich habe der Datei my.cnf unter [client], [mysqld] und [mysql] local-infile = 1 hinzugefügt und Kombinationen davon verwendet. Alle mit den gleichen Ergebnissen. Ich habe versucht, die Workbench neu zu starten, aber kein Glück. Ich habe die mySQL-Workbench auch zwischen jeder Änderung gestoppt und gestartet.
OrwellHindenberg
2
Ein Update von mySQL auf 6.2.5 löste dieses Problem für mich
OrwellHindenberg
Die Antwort ist in die richtige Richtung. Aber für diejenigen, die hier mit diesem Problem konfrontiert sind, ist ein weiteres Problem. Wenn Sie Apparmor auf Ihrem System aktiviert haben und das Problem weiterhin besteht, überprüfen Sie das Syslog, um festzustellen, ob der mysqld-Daemon blockiert wird. Ich hatte dieses Problem : apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. Die Lösung ist sehr einfach. Aktualisieren Sie einfach Ihren /etc/apparmor.d/local/usr.sbin.mysqldund laden Sie den Apparmor-Dienst neu.
Leo
60

Die my.cnf-Datei, die Sie bearbeiten sollten, ist die Datei /etc/mysql/my.cnf . Gerade:

sudo nano /etc/mysql/my.cnf

Dann füge hinzu:

[mysqld]
local-infile 

[mysql]
local-infile 

Die Header [mysqld] und [mysql] sind bereits angegeben. Suchen Sie sie einfach in der Datei und fügen Sie unter jedem eine lokale Datei hinzu .

Es funktioniert für mich unter MySQL 5.5 unter Ubuntu 12.04 LTS.

Hlosukwakha
quelle
1
Dies hat es definitiv für mich mit Ubuntu 12.04 behoben.
John Fiala
4
Ich kann es auch bestätigen Ubuntu 14.04.2 LTS not working.
Ain Tohvri
Funktioniert auch für Mac. Für Mac-Benutzer ist /mysql/my.cnfstandardmäßig nicht vorhanden. Erstellen Sie einfach das Verzeichnis und die Datei und fügen Sie diese Zeilen in die Datei ein.
Zheng Liu
Wenn Sie nicht möchten, dass diese Konfiguration beim Upgrade von mysql überschrieben wird, sollten Sie dies in /etc/mysql/conf.d/enable-local-infile.cnf setzen. Vergessen Sie dies auch nicht, sudo service mysql restartnachdem Sie die Konfiguration geändert haben, damit sie wirksam wird.
Stephen Ostermiller
Dies ist die richtige Lösung. Die am höchsten bewertete Lösung erwähnt nicht, dass Sie [mysqld] zuerst vor der Zeile local-infile eingeben müssen.
user3260912
30

Ersetzen Sie den Treiber php5-mysql durch den nativen Treiber

Auf Debian

apt-get install php5-mysqlnd
BeniSK
quelle
Das hat funktioniert! Mit stock aws 12.04 ubuntu brauchte ich 'local', um eine Verbindung zu RDS herzustellen. Tausend Dank!
James Bowler
Vielen Dank, diese Lösung hat bei mir funktioniert. Ich habe die Frage stackoverflow.com/questions/36526102/…
user75472
Kein Erfolg Ubuntu 12.04
Zbyszek
ein weiterer zufriedener Kunde! Ubuntu 14.04 MySQL 5.7
Nodoze
27

Ich habe dieses Problem unter MySQL 8.0.11 mit dem Befehl mysql terminal gelöst:

SET GLOBAL local_infile = true;

Ich meine, ich habe mich zuerst mit dem Üblichen angemeldet:

mysql -u user -p*

Danach können Sie den Status mit dem Befehl sehen:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Es sollte eingeschaltet sein. Ich werde hier nicht über Sicherheit schreiben, die beim Laden lokaler Dateien in die Datenbank ausgegeben wird.

Oleksiy Muzalyev
quelle
Ich habe viele andere Lösungen ausprobiert, aber nur der Befehl SET GLOBAL local_infile = true; funktioniert. Meine MySQL-Version ist 8.0.12. Vielleicht ist dies die neueste Lösung. Vielen Dank.
Mathsyouth
1
Leider ist die Variable nach dem Neustart des Servers wieder AUS.
Pedro
Mohit, irgendwie habe ich es gelöst, weil jetzt die globale Variable 'local_infile' auch nach dem Neustart immer ON ist. Und anscheinend habe ich meine my.cnf-Datei dafür nicht verwendet. Könnten Sie bitte versuchen, sich bei PhpMyAdmin, der neuesten Version, als root anzumelden, zum Abschnitt "Variablen" gehen, nach "local_infile" suchen, dann auf "Bearbeiten" klicken und in "EIN" ändern und schließlich die Eingabetaste drücken. Hat es funktioniert?
Oleksiy Muzalyev
2
Nur diese Antwort funktionierte für mich 8.0.12 MySQL Community Serverunter Windows.
Endo64
Ich habe MySQL 8.0.16 auf Windows Server 2016 installiert, ich habe den SET GLOBAL local_infile = true;Befehl ausgeführt, aber ich ERROR 1148 (42000): The used command is not allowed with this MySQL versionerhalte immer noch den gleichen Fehler, aber die Verbindung zu MySQL mit --load-infile = 1 hat funktioniertmysql --local-infile=1 -u root -p
Junior
13

Falls Ihre MySQL-Version unter Ubuntu unter keinen Umständen funktioniert und Sie dennoch den Fehler 1148 erhalten, können Sie den load data infileBefehl über die Befehlszeile ausführen

Öffnen Sie ein Terminalfenster

Lauf mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

Sie werden aufgefordert, das mysqluser-Passwort einzugeben

Sie werden MySQLMonitor ausführen und Ihre Eingabeaufforderung wird sein mysql>

Führen Sie Ihren load data infileBefehl aus (vergessen Sie nicht, mit einem Semikolon zu enden ; ).

so was:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Tony Gil
quelle
9

Siehe Bild unten ...

Ich habe --local-infile=1zum normalen MySQL-Befehl hinzugefügtmysql -u root -p

Die Gesamtlinie wäre also:

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

Geben Sie hier die Bildbeschreibung ein

Jagadeesh Pulamarasetti
quelle
Das hat bei mir funktioniert, wenn SET GLOBAL ..nicht. Startet ein 'source'-Befehl ( \. file.sql) irgendwie eine neue Sitzung oder setzt er diese zurück? Ich habe jedoch nicht versucht, die Einstellung in mmy sql script zu setzen.
Toddkaufmann
5

Wenn Sie dies für andere Leser in Django versuchen UND Ihr Server local_infile zulässt (Sie können dies überprüfen, indem Sie SHOW VARIABLES über einen MySQL-Client eingeben), können Sie dies zu Ihrer Datei settings.py hinzufügen (da Python MySQLdb dies nicht tut). t Lesen Sie standardmäßig die Datei .my.cnf):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}
brfox
quelle
3

Sie müssen darauf achten, wie Sie Ihre MySQL-Verbindung herstellen. Die volle Anerkennung für diese Lösung geht an Jorge Albarenque, Quelle

Um das Problem zu beheben, musste ich:

  • Fügen Sie local-infile = 1 zu den Abschnitten [mysqld] und [mysql] von my.cnf hinzu (wie in den obigen Kommentaren erläutert).
  • Verwenden Sie die Funktion mysqli_real_connect ( PHP-Dokumentation ).

Der Haken ist, dass Sie mit dieser Funktion die Unterstützung für LOAD DATA LOCAL INFILE explizit aktivieren können. Zum Beispiel (prozeduraler Stil):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

oder objektorientiert

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
sieppl
quelle
1
@Mask Kann nicht bestätigen. Meine Lösung läuft am 5.5.46 (Ubuntu)
sieppl
3

Wenn sich Ihre CSV-Datei mit db identisch befindet , müssen Sie LOCAL in LOAD DATA INFILE entfernen, da sonst der Fehler angezeigt wird

Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig

Wingoo
quelle
Das hat es für mich getan, aber dann musste ich auch Nelsons Antwort hier
Dominic
1

Eine andere Möglichkeit ist die Verwendung des mysqlimportClient-Programms.

Sie rufen es wie folgt auf:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Dies erzeugt eine LOAD DATAAnweisung, die tableName.txtin die geladen wirdtableName Tabelle geladen wird.

Beachten Sie Folgendes:

mysqlimportbestimmt den Tabellennamen aus der von Ihnen angegebenen Datei; Verwenden Sie den gesamten Text vom Beginn des Dateinamens bis zum ersten Punkt als Tabellennamen. Also, wenn Sie mehrere Dateien auf den Tisch laden möchten könnte man sich wie unterscheiden tableName.1.txt, tableName.2.txt..., usw., zum Beispiel.

Schalk
quelle
1

Das war ein bisschen komisch für mich, von einem Tag auf den anderen hat das Skript, das seit Tagen funktioniert, einfach aufgehört zu arbeiten. Es gab keine neuere Version von MySQL oder irgendeine Art von Upgrade, aber ich bekam den gleichen Fehler, also versuche ich die CSV-Datei ein letztes Mal und stelle fest, dass am Zeilenende \ n anstelle der erwarteten verwendet wurde (gemäß meinem Skript) ) \ r \ n also speichere ich es mit der richtigen EOL und führe das Skript ohne Probleme erneut aus.

Ich finde es seltsam, wenn MySQL mir sagt, dass der verwendete Befehl in dieser MySQL-Version nicht zulässig ist, da der Grund völlig anders war.

Mein Arbeitsbefehl sieht folgendermaßen aus:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.
Oscar Nevarez
quelle
1

Ich habe die folgende Methode verwendet, für die keine Änderung der Konfiguration erforderlich ist Sie wurde unter mysql-5.5.51-winx64 und 5.5.50-MariaDB getestet:

Fügen Sie 'load data ...' in die SQL-Datei ein (z. B. LoadTableName.sql).

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

dann:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Jawad Al Shaikh
quelle
1

Falls MySQL 5.7 verwendet werden kann, können Sie "globale Variablen wie" local_infile "anzeigen;" Dies gibt den lokalen Infile-Status an. Sie können ihn mit "set global local_infile = ON;" aktivieren.

Midhunlal
quelle
0

Ok, hier passiert etwas Seltsames. Damit dies funktioniert, müssen Sie KEINE Konfigurationsänderungen in /etc/mysql/my.cnf vornehmen. Sie müssen lediglich den aktuellen MySQL-Dienst im Terminal neu starten:

sudo service mysql restart

Wenn ich dann den Fehler "neu erstellen" möchte, starte ich einfach den Apache-Dienst neu:

sudo service apache2 restart

Was dann durch Eingabe des folgenden Befehls wieder behoben werden kann:

sudo service mysql restart

Es scheint also, dass der Apache2 etwas unternimmt, um diese Funktion beim Start nicht zuzulassen (was dann umgekehrt / korrigiert wird, wenn der MySQL-Dienst neu gestartet wird).

Gültig in Debian-basierten Distributionen.

service mysqld restart
service httpd restart

Gültig in RedHat-basierten Distributionen

Bradymiller
quelle
0

Für diejenigen unter Ihnen, die nach Antworten suchen, damit LOAD DATA LOCALINFILE wie ich funktioniert, könnte dies wahrscheinlich funktionieren. Nun, es hat bei mir funktioniert, also geht es los. Installieren Sie perconaals MySQL-Server und -Client, indem Sie die Schritte unter dem Link ausführen. Während der Installation wird ein Kennwort abgefragt. Geben Sie daher ein Kennwort ein, an das Sie sich erinnern, und verwenden Sie es später. Eine die Installation abgeschlossen ist, starten Sie Ihr System und testen , ob der Server in Betrieb ist , indem zum Gehen terminalund tippen mysql -u root -pund dann das Passwort. Versuchen Sie, den Befehl auszuführenLOAD DATA LOCAL INFILE jetzt auszuführen. Hoffe, es funktioniert :)

Übrigens habe ich mit Ruby 1.9.3 unter Ubuntu 12.04 an Rails 2.3 gearbeitet.

Varun Natraaj
quelle
0

Alle: Offensichtlich funktioniert dies wie geplant. Bitte beachten Sie den neuen Verweis vom 23.7.1920, Abschnitt 6.1.6, Sicherheitsprobleme mit LOAD DATA LOCAL .

viejo
quelle
0

Fügen Sie local_infilebeide clientund mysqldAbschnitt hinzu.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Getestet in MySQL 8.x sowohl unter Windows als auch unter Linux.

Madan Sapkota
quelle
0

Ich verwende xampp v3.2.4 und MySQL Server 8.0.20.

Ich habe local-infile=1zu [mysql]und [mysqld]in der Datei "my.ini" hinzugefügt. Die Datei befindet sich unter "C: \ xampp \ mysql \ bin \ my.ini".

Dann habe ich die Daten aus der CSV-Datei mit dem folgenden Code eingefügt LOAD DATA INFILE .... Es ist wichtig, LOCAL zu bewegen. Sonst funktioniert es nicht.

Vielen Dank für alle Vorschläge oben. Eine Kombination hat für mich endlich geklappt.

user7849670
quelle