Zugriff für Ladedaten-Infile in MySQL verweigert


105

Ich benutze ständig MySQL-Abfragen in PHP, aber wenn ich es versuche

LOAD DATA INFILE

Ich erhalte den folgenden Fehler

# 1045 - Zugriff für Benutzer 'Benutzer' @ 'localhost' verweigert (mit Passwort: JA)

Weiß jemand was das bedeutet?

Antworten:


195

Ich bin gerade auch auf dieses Problem gestoßen. Ich musste LOCALmeiner SQL-Anweisung hinzufügen .

Dies führt beispielsweise zu dem Berechtigungsproblem:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Fügen Sie LOCALIhrer Erklärung hinzu, und das Problem mit den Berechtigungen sollte behoben sein. Wie so:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
Das macht eine andere Sache. Es lädt Ihre Datei in einem temporären Verzeichnis auf den Server hoch. Dies ist manchmal erforderlich, aber wenn sich die Datei bereits auf dem MySQL-Server befindet, machen Sie nur redundante Arbeit.
Jeffcook2150

1
Ja, das hat den Trick für mich getan. Ich habe den Datenbankserver-Port über ssh weitergeleitet und ich denke, er hat nach der Datei auf dem entfernten Datenbankserver ohne den LOKALEN Teil gesucht
Mike

2
@jeremysawesome für mich führt dies zu folgendem Fehler: Fehlercode: 1148 Der verwendete Befehl ist in dieser MySQL-Version nicht zulässig. Ich habe einige Antworten auf dieses Problem versucht, z. B. das Ändern der MySQL-Datei in local-infile = 1, und das ist ebenfalls fehlgeschlagen.
OrwellHindenberg

Ein Update von mySQL auf 6.2.5 löste dieses Problem für mich
OrwellHindenberg

4
Möglicherweise müssen Sie auch MySQL mit der --local-infileOption aufrufen .
Shabbychef

31

Ich hatte dieses Problem. Ich suchte herum und fand keine zufriedenstellende Antwort. Ich fasse unten die Ergebnisse meiner Suche zusammen.

Der Fehler "Zugriff verweigert" kann Folgendes bedeuten:

  • 'user' @ 'localhost' hat nicht das FILE-Privileg ( GRANT FILE on *.* to user@'localhost'); oder,
  • Die Datei, die Sie laden möchten, ist auf dem Computer, auf dem der MySQL-Server ausgeführt wird, nicht vorhanden (wenn Sie LOAD DATA INFILE verwenden). oder,
  • Die Datei, die Sie laden möchten, ist auf Ihrem lokalen Computer nicht vorhanden (wenn Sie LOAD DATA LOCAL INFILE verwenden). oder,
  • Die Datei, die Sie laden möchten, ist nicht für die Welt lesbar (Sie müssen die Datei und alle übergeordneten Verzeichnisse für die Welt lesbar sein: Verzeichnis chmod 755; und Datei chmod 744 file.dat).

+1: Das hat bei mir funktioniert: Die Datei, die Sie laden möchten, ist nicht weltweit lesbar (Sie müssen die Datei und alle übergeordneten Verzeichnisse weltweit lesbar sein: Verzeichnis chmod 755; und chmod 744 file.dat) . Ich hatte die Berechtigungen für alle meine Verzeichnisse nicht geändert
gavdotnet

1
Benutzer Tatiana weist darauf hin, dass Sie das FILE-Privileg nicht pro Datenbank nur für den gesamten Server gewähren können. Der Grant-Befehl lautet "GRANT FILE on . To user @ 'localhost' IDENTIFIED BY 'password');"
JAL

3
@ JAL Ich denke du meinst "GRANT FILE ON *. * To user ..." - wahrscheinlich wurden die Sternchen entfernt
Eugene M

Wie @Eugene M sagte, gibt dies einen Fehler. Falsche Verwendung von DB GRANT und GLOBAL PRIVILEGES
Accountant م

19

Versuchen Sie es mit diesem Befehl:

load data local infile 'home/data.txt' into table customer;

Das sollte funktionieren. In meinem Fall hat es funktioniert.


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Stewart

@Stewart, bitte entfernen Sie 'local' aus dem obigen Befehl. Spätere MySQL-Versionen scheinen dieses Flag nicht zu unterstützen, wenn die globale Variable 'local_infile' auf 'ON' gesetzt ist (wie unten). Der Befehl wird daher sein; mysql> lade die Dateninfile 'home / data.txt' in die Tabelle customer; + --------------- + ------- + | Variablenname | Wert | + --------------- + ------- + | local_infile | EIN | + --------------- + ------- +
Kamran Hyder

@KamranHyder Klingt so, als hättest du eine gute Antwort auf mich. Warum nicht als vollständige Antwort hinzufügen?
Stewart

10

Stellen Sie sicher, dass Ihrem MySQL-Benutzer die Berechtigung FILE erteilt wurde.

Wenn Sie ein gemeinsames Webhosting verwenden, besteht die Möglichkeit, dass dies von Ihrem Hosting-Anbieter blockiert wird.


Bei einem gemeinsam genutzten Webhosting: Wäre es hilfreich, "LOAD DATA LOCAL INFILE" zu verwenden?
Peter

3

Die Zeichenfolge aus Lyon gab mir einen sehr guten Tipp: Unter Windows müssen wir Slahes und keine Backslashes verwenden. Dieser Code funktioniert für mich:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

Ich bin auf dasselbe Problem gestoßen und habe es gelöst, indem ich die folgenden Schritte ausgeführt habe:

  • Aktivieren Sie die Variable load_infile
  • Grand-File-Berechtigung für meinen benutzerdefinierten MySQL-Benutzer
  • Deaktivieren Sie die Variable secure_file_priv (meine Datei wurde vom Webserver in den Ordner / tmp hochgeladen, der natürlich nicht das gesicherte Verzeichnis von myslq / var / lib / mysql-file ist.)

Zu diesem dritten Punkt verweisen Sie auf: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

BR,

ANZEIGE


2

Dies passierte mir auch und obwohl ich alle von Yamir in seinem Beitrag beschriebenen Schritte befolgt hatte, konnte ich es nicht zum Laufen bringen.

Die Datei befand sich in /tmp/test.csv mit 777 Berechtigungen. Der MySQL-Benutzer hatte Dateiberechtigungen. Die Option LOCAL war in meiner MySQL-Version nicht zulässig, sodass ich nicht weiterkam.

Endlich konnte ich das Problem lösen, indem ich Folgendes ausführte:

sudo chown mysql:mysql /tmp/test.csv

2

Ich fand es einfach, wenn Sie die Befehlszeile verwenden

Anmelden alsmysql -u[username] -p[password] --local-infile

dann SET GLOBAL local_infile = 1;

Wählen Sie Ihre Datenbank mit aus use [db_name]

und schlussendlich LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


Das Hinzufügen von --local-inline hat mir geholfen. In meinem Fall wurde die globale Variable local_infile jedoch bereits auf ON gesetzt. Ich denke, Benutzer sollten zuerst herausfinden, welchen Wert sie in diese Variable geschrieben haben, bevor sie sie ändern.
Eugene Maysyuk

Für RDS-Benutzer => Das Hinzufügen der --local-infile hat mir bei RDS geholfen, SET GLOBAL local_infile = 1;scheint jedoch in RDS nicht zu funktionieren, aber trotzdem hat das --local-infileden Trick getan
Fakt

0

Ich habe festgestellt, dass das Laden von MySQL-Tabellen schnell und problemlos sein kann (ich habe Python / Django Model Manager-Skripte verwendet):

1) Erstellen Sie eine Tabelle mit allen Spalten VARCHAR (n) NULL, z.

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) Entfernen Sie die Header (erste Zeile) aus csv und laden Sie sie (wenn Sie LOCAL vergessen haben, erhalten Sie "# 1045 - Zugriff für Benutzer 'user' @ 'localhost' verweigert (mit Passwort: YES)"):

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) Spalten ändern:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!


-5

Dies bedeutet wahrscheinlich, dass das von Ihnen angegebene Passwort 'user'@'localhost'falsch ist.


1
Das glaube ich nicht. Ich kann andere Abfragen mit demselben Passwort durchführen.
Brian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.