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

78

Ich versuche, Daten mit in die MySQL-Datenbank zu laden

LOAD DATA LOCAL
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

Das Thema dieser Frage ist die Antwort, die ich bekomme. Ich verstehe, dass das lokale Daten-Offloading standardmäßig deaktiviert ist und ich es mit dem Befehl aktivieren muss, local-infile=1aber ich weiß nicht, wo ich diesen Befehl platzieren soll.

Sosytee
quelle

Antworten:

114

Sie können dies als zusätzliche Option beim Einrichten Ihrer Clientverbindung angeben:

mysql -u myuser -p --local-infile somedatabase

Dies liegt daran, dass diese Funktion eine Sicherheitslücke öffnet. Sie müssen es also explizit aktivieren, falls Sie es wirklich verwenden möchten.

Sowohl Client als auch Server sollten die Option für lokale Dateien aktivieren. Andernfalls funktioniert es nicht. Um es für Dateien auf dem serverseitigen Server zu aktivieren, fügen Sie der my.cnfKonfigurationsdatei Folgendes hinzu :

loose-local-infile = 1
Arkascha
quelle
FEHLER 1045 (28000): Zugriff für Benutzer '' @ 'localhost' verweigert (mit Passwort: NEIN)
Teja
1
Der Fehler ist wie oben arkascha, .. Ich versuche, eine kleine Datei mit dem Befehl LOAD INFILE in die MySQL-Tabelle zu schreiben.
Teja
1
@ SOaddict Hm, sieht für mich nach einem einfachen Authentifizierungsfehler aus? Sie versuchen eine Verbindung ohne Passwort herzustellen? Können Sie auf die gleiche Weise eine Verbindung zu einer interaktiven Sitzung herstellen, ohne Daten aus einer Datei zu laden? Aber wie auch immer: Sie überfallen jemand anderen Frage / Antwort! Bitte stellen Sie Ihre Frage separat. Sie werden sicherlich viel Hilfe bekommen!
Arkascha
1
@arkascha "öffnet eine Sicherheitslücke" bedeutet? BEARBEITEN
user706420
1
lose-lokal-infile = 1 sollte in Ihrer my.cnf- oder my.ini-Datei unter dem Abschnitt [client] stehen, nicht im Abschnitt [mysqld]. Sie können local_infile = 1 auch in den Abschnitt [mysqld] einfügen.
James
59

Ich finde die Antwort hier .

Dies liegt daran, dass die Servervariable local_infileauf FALSE | 0 gesetzt ist . Siehe aus dem Dokument .

Sie können dies überprüfen, indem Sie Folgendes ausführen:

SHOW VARIABLES LIKE 'local_infile';

Wenn Sie über die Berechtigung SUPER verfügen, können Sie diese aktivieren (ohne den Server mit einer neuen Konfiguration neu zu starten), indem Sie Folgendes ausführen:

SET GLOBAL local_infile = 1;
Java Xu
quelle
5
Zuerst wollte ich dies +1, weil es die einzige Antwort hier war, die die Variable local-infile erfolgreich auf ON gesetzt hat, aber den Fehler nicht behoben hat.
Codehelp4
1
Hat für mich gearbeitet! Aber ich habe es in der angegebenen Methode nicht geändert. Ich habe die Konfigurationsdatei my.ini des Servers bearbeitet und dort festgelegt local_infile=1und den Serverdienst neu gestartet. Außerdem habe ich den Client mit der --local-infile dbnameOption ausgeführt, z mysql -u root -p --local-infile mydatabase.
Anddero
1
Dies ist ein seltsamer Fall, aber ich habe den Fehler weiterhin erhalten, während meine local_infine = on / True ist. Dies lag daran, dass ich meine Tabelle in MySQL Workbench erstellt und dann versucht habe, die lokalen CSV-Daten über cmd hinzuzufügen. Ich habe es behoben, indem ich die Tabelle gelöscht und eine neue über cmd erstellt und die Daten auch über cmd hinzugefügt habe.
EatSleepCode
13

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

Fügen Sie dies in my.cnf ein - der [client]Abschnitt sollte bereits vorhanden sein (wenn Sie sich nicht zu sehr um die Sicherheit sorgen ).

[client]
loose-local-infile=1
Vérace
quelle
1
Irgendwelche Ideen, wohin es 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
1
Ein Update von mySQL auf 6.2.5 löste dieses Problem für mich
OrwellHindenberg
@OrwellHindenberg - hast du lose -local-infile = 1 verwendet - du hast nur local-infile.
Vérace
Ich habe vor den Updates versucht, was in Ihrer ursprünglichen Antwort stand. Ich erinnere mich nicht, "lose" verwendet zu haben. Das Aktualisieren von mySQL hat jedoch bei mir funktioniert.
OrwellHindenberg
@OrwellHindenberg - überprüfen Sie die Bearbeitung. Es war immer locker- lokal-infil. Die Bearbeitung korrigierte lediglich meine (zu der Zeit) Neulinge Präsentation / dba.se-Stil Fehler
Vérace
10

All dies hat es für mich auf meinem brandneuen Ubuntu 15.04 nicht gelöst.

Ich entfernte das LOCALund bekam diesen Befehl:

LOAD DATA
INFILE A.txt
INTO DB
LINES TERMINATED BY '|';

aber dann bekam ich:

MySQL said: File 'A.txt' not found (Errcode: 13 - Permission denied)

Das führte mich zu dieser Antwort von Nelson auf eine andere Frage zum Stackoverflow, die das Problem für mich löste!

Dominic
quelle
1
Hinweis: Ich bin mir ziemlich sicher, dass dadurch auch der erwartete Dateispeicherort vom Clientcomputer auf den Servercomputer verschoben wird. (Wenn sie die gleiche Maschine sind, werden Sie möglicherweise nicht bemerken.)
Ebyrob
Der MySQL-Server wird mit der Option --secure-file-priv ausgeführt, sodass er diese Anweisung nicht ausführen kann
SmallChess
9

SpringBoot 2.1 mit Standard-MySQL-Connector

Um dies zu lösen, folgen Sie bitte den Anweisungen

1. SET GLOBAL local_infile = 1;

Befolgen Sie zum Festlegen dieser globalen Variablen die Anweisungen in der MySQL-Dokumentation https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html

2. Ändern Sie die MySQL Connector-Zeichenfolge

allowLoadLocalInfile = true Beispiel: jdbc: mysql: // localhost: 3306 / xxxx? useSSL = false & useUnicode = yes & characterEncoding = UTF-8 & allowLoadLocalInfile = true

Vineet Sharma
quelle
5

Ich hatte das gleiche Problem beim Importieren der CSV-Datei in AWS MySQL 8.0 RDS.

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' IN TABLE test.demo2 FELDER BEENDET VON ',' ENCLOSED BY '"' LINES TERMINATED BY '\ n' IGNORE 1 LINES;

FEHLER 1148 (42000): Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig

1) Auf local_infileParameter prüfen

mysql> SHOW VARIABLES LIKE 'local_infile';

2) Melden Sie sich vom Client ab und melden Sie sich mit dem folgenden Parameter erneut an.

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

3) Führen Sie den gleichen Befehl aus

mysql> LOAD DATA LOCAL INFILE '/tmp/your.csv' INTO TABLE test.demo2 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 LINES;


Query OK, 300 rows affected (0.01 sec)

Records: 300  Deleted: 0  Skipped: 0  Warnings: 0
Nilesh Mishra
quelle
4

Ich hatte auch Probleme mit diesem Problem, als ich versuchte, CSV-Daten von meinem lokalen Computer mit MySQL Workbench unter Windows in die AWS RDS-Instanz hochzuladen .

Der Zusatz, den ich brauchte, war das Hinzufügen OPT_LOCAL_INFILE=1von: Verbindung> Erweitert> Andere. Hinweis CAPS war erforderlich.

Ich habe diese Antwort von PeterMag in AWS Developer Forums gefunden .


Für weitere Informationen:

SHOW VARIABLES LIKE 'local_infile';bereits zurückgegeben ON und die Abfrage war:

LOAD DATA LOCAL INFILE 'filepath/file.csv' 
    INTO TABLE `table_name`
    FIELDS TERMINATED BY ',' 
    ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
    IGNORE 1 ROWS;

Kopieren aus der oben genannten Antwortquelle:

Anscheinend ist dies ein Fehler in MYSQL Workbench V8.X. Zusätzlich zu den zuvor in diesem Thread gezeigten Konfigurationen müssen Sie die MYSQL-Verbindung in Workbench wie folgt ändern:

  1. Gehen Sie zur Begrüßungsseite von MYSQL, auf der alle Ihre Verbindungen angezeigt werden
  2. Wählen Sie Serververbindungen verwalten (das kleine Schraubenschlüsselsymbol).
  3. Wählen Sie Ihre Verbindung
  4. Wählen Sie die Registerkarte Erweitert
  5. Fügen Sie im Feld Andere OPT_LOCAL_INFILE = 1 hinzu

Jetzt kann ich die Abfrage LOAD DATA LOCAL INFILE auf MYSQL RDS verwenden. Es scheint, dass die File_priv-Berechtigung nicht erforderlich ist. *

Adam Marsh
quelle
3

Nur eine kleine Ergänzung.

Es wurde eine weitere Reinkarnation in mysql.connector Version 8.0.16 gefunden. Jetzt ist allow_local_infile = True erforderlich. Andernfalls wird der obige Fehler angezeigt . Arbeitete in früheren Versionen.

conn = mysql.connector.connect(host=host, user=user, passwd=passwd, database=database, allow_local_infile=True)
VladimirS
quelle
2

Wenn Sie Java8 oder +, JDBC und MySql8 verwenden und auf dieses Problem stoßen, versuchen Sie Folgendes:

Parameter zur Verbindungszeichenfolge hinzufügen:

jdbc:mysql://localhost:3306/tempDB?allowLoadLocalInfile=true

Auch einstellen

local_infile = 1

in der Datei my.cnf.

Die neueste Version von mysql-java-connector erlaubt möglicherweise keine direkte Verbindung zu einer lokalen Datei. Mit diesem Parameter können Sie ihn also aktivieren. Das funktioniert bei mir.

Atul
quelle
1

Ich habe diesen Fehler beim Laden von Daten bei Verwendung von Docker [1] erhalten. Die Lösung funktionierte, nachdem ich die nächsten Schritte ausgeführt hatte. Anfangs habe ich die Datenbank und die Tabelle erstellt datavaultund fdata. Beim Versuch, die Daten zu importieren [2], wurde der Fehler [3] angezeigt. Dann habe ich:

  • SET GLOBAL local_infile = 1;
  • Bestätigen Sie mit SHOW VARIABLES LIKE 'local_infile';
  • Dann habe ich meine MySQL-Sitzung neu gestartet: mysql -P 3306 -u required --local-infile=1 -pSiehe [4] zur Benutzererstellung.
  • Ich habe meinen Tisch neu erstellt, da dies mein Problem gelöst hat:
    • use datavault;
    • drop table fdata;
    • CREATE TABLE fdata (fID INT, NAME VARCHAR(64), LASTNAME VARCHAR(64), EMAIL VARCHAR(128), GENDER VARCHAR(12), IPADDRESS VARCHAR(40));
  • Schließlich habe ich die Daten mit [2] importiert.

Der Vollständigkeit halber möchte ich hinzufügen, dass ich die MySQL-Version im Container über ausgeführt habe docker exec -it testdb sh. Die MySQL- Version war MySQL Version 8.0.17 für Linux unter x86_64 (MySQL Community Server - GPL) . Dies wurde auch mit mysql.exe Ver 14.14 Distrib 5.7.14 für Win64 (x86_64) getestet, einer anderen Version von mysql von WAMP64. Die zugehörigen verwendeten Befehle sind in [5] aufgeführt.


[1] docker run --name testdb -v //c/Users/C/Downloads/data/csv-data/:/var/data -p 3306 -e MYSQL_ROOT_PASSWORD=password -d mysql:latest

[2] load data local infile '/var/data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n' IGNORE 1 ROWS;

[3] FEHLER 1148 (42000): Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig

[4] Der erforderliche Client wurde erstellt mit:

  • CREATE USER 'required'@'%' IDENTIFIED BY 'password';
  • GRANT ALL PRIVILEGES ON * . * TO 'required'@'%';
  • FLUSH PRIVILEGES;
  • Möglicherweise benötigen Sie diese Zeile, ALTER USER 'required'@'%' IDENTIFIED WITH mysql_native_password BY 'password';wenn dieser Fehler auftritt :Authentication plugin ‘caching_sha2_password’ cannot be loaded

[5] Befehle mit MySQL von WAMP64:

  • mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile=1Dabei ist der Port der Port, der dem Host zugeordnet ist, wie von beschrieben, docker ps -aund die Host-IP wurde mit ausgewählt docker-machine ip(Dies hängt vom Betriebssystem und möglicherweise von der Docker- Version ab).
  • Erstellen Sie die Datenbank datavault2 und die Tabelle fdata wie oben beschrieben
  • load data local infile 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' into table fdata fields terminated by ',' enclosed by '' lines terminated by '\n';
  • Für meinen Datensatz funktionierte diese andere Alternative zum Laden der Datei, nachdem ich zuvor datavault3 und fdata erstellt hatte : mysql -urequired -ppassword -P 32775 -h 192.168.99.100 --local-infile datavault3 -e "LOAD DATA LOCAL INFILE 'c:/Users/C/Downloads/data/csv-data/mockdata.csv' REPLACE INTO TABLE fdata FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS"und sie lud die Daten erfolgreich, die nach dem Ausführen leicht überprüft werden konnten select * from fdata limit 10;.
KF
quelle
0

Die besten Antworten sind richtig. Bitte überprüfen Sie sie zuerst direkt in MySQL CLI. Wenn dies das Problem dort behebt, möchten Sie möglicherweise, dass es in Python3 funktioniert. Übergeben Sie es einfach an den MySQLdb.connectParameter as

self.connection = MySQLdb.connect(
                    host=host, user=settings_DB.db_config['USER'],
                    port=port, passwd=settings_DB.db_config['PASSWORD'], 
                    db=settings_DB.db_config['NAME'],
                    local_infile=True)
gies0r
quelle