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.
my.cnf
Pfad/etc/mysql/my.cnf
in meinem Computer (AWS EC2).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.mysqld
und laden Sie den Apparmor-Dienst neu.Die my.cnf-Datei, die Sie bearbeiten sollten, ist die Datei /etc/mysql/my.cnf . Gerade:
Dann füge hinzu:
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.
quelle
Ubuntu 14.04.2 LTS not working
./mysql/my.cnf
standardmäßig nicht vorhanden. Erstellen Sie einfach das Verzeichnis und die Datei und fügen Sie diese Zeilen in die Datei ein./etc/mysql/conf.d/enable-local-infile.cnf
setzen. Vergessen Sie dies auch nicht,sudo service mysql restart
nachdem Sie die Konfiguration geändert haben, damit sie wirksam wird.Ersetzen Sie den Treiber php5-mysql durch den nativen Treiber
Auf Debian
quelle
Ich habe dieses Problem unter MySQL 8.0.11 mit dem Befehl mysql terminal gelöst:
Ich meine, ich habe mich zuerst mit dem Üblichen angemeldet:
Danach können Sie den Status mit dem Befehl sehen:
Es sollte eingeschaltet sein. Ich werde hier nicht über Sicherheit schreiben, die beim Laden lokaler Dateien in die Datenbank ausgegeben wird.
quelle
SET GLOBAL local_infile = true;
funktioniert. Meine MySQL-Version ist 8.0.12. Vielleicht ist dies die neueste Lösung. Vielen Dank.8.0.12 MySQL Community Server
unter Windows.SET GLOBAL local_infile = true;
Befehl ausgeführt, aber ichERROR 1148 (42000): The used command is not allowed with this MySQL version
erhalte immer noch den gleichen Fehler, aber die Verbindung zu MySQL mit --load-infile = 1 hat funktioniertmysql --local-infile=1 -u root -p
Falls Ihre MySQL-Version unter Ubuntu unter keinen Umständen funktioniert und Sie dennoch den Fehler 1148 erhalten, können Sie den
load data infile
Befehl ü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 infile
Befehl aus (vergessen Sie nicht, mit einem Semikolon zu enden;
).so was:
quelle
Siehe Bild unten ...
Ich habe
--local-infile=1
zum normalen MySQL-Befehl hinzugefügtmysql -u root -p
Die Gesamtlinie wäre also:
quelle
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.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):
quelle
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:
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):
oder objektorientiert
quelle
Wenn sich Ihre CSV-Datei mit db identisch befindet , müssen Sie LOCAL in LOAD DATA INFILE entfernen, da sonst der Fehler angezeigt wird
quelle
Eine andere Möglichkeit ist die Verwendung des
mysqlimport
Client-Programms.Sie rufen es wie folgt auf:
Dies erzeugt eine
LOAD DATA
Anweisung, dietableName.txt
in die geladen wirdtableName
Tabelle geladen wird.Beachten Sie Folgendes:
mysqlimport
bestimmt 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 unterscheidentableName.1.txt
,tableName.2.txt
..., usw., zum Beispiel.quelle
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:
quelle
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).
dann:
quelle
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.
quelle
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:
Wenn ich dann den Fehler "neu erstellen" möchte, starte ich einfach den Apache-Dienst neu:
Was dann durch Eingabe des folgenden Befehls wieder behoben werden kann:
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.
Gültig in RedHat-basierten Distributionen
quelle
Für diejenigen unter Ihnen, die nach Antworten suchen, damit LOAD DATA
LOCAL
INFILE wie ich funktioniert, könnte dies wahrscheinlich funktionieren. Nun, es hat bei mir funktioniert, also geht es los. Installieren Siepercona
als 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 Gehenterminal
und tippenmysql -u root -p
und 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.
quelle
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 .
quelle
Fügen Sie
local_infile
beideclient
undmysqld
Abschnitt hinzu.Getestet in MySQL 8.x sowohl unter Windows als auch unter Linux.
quelle
Ich verwende xampp v3.2.4 und MySQL Server 8.0.20.
Ich habe
local-infile=1
zu[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.
quelle