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?

Brian
quelle

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}
jeremysawesome
quelle
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).
Yamir Encarnacion
quelle
+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.

Shreyas-Agrawal
quelle
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.

Tanerkay
quelle
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();
Matthias Wuttke
quelle
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

user7996813
quelle
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
Giacomo
quelle
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;

Shantanu Khond
quelle
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à!

Magula
quelle
-5

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

David Grant
quelle
1
Das glaube ich nicht. Ich kann andere Abfragen mit demselben Passwort durchführen.
Brian