web-dev-qa-db-de.com

Zugriff für Ladedateninfile in MySQL verweigert

Ich verwende MySQL-Abfragen die ganze Zeit in PHP, aber wenn ich LOAD DATA INFILE versuche, erhalte ich die folgende Fehlermeldung #1045 - Access denied for user 'user'@'localhost' (using password: YES) Weiß jemand, was das bedeutet?

94
Brian

Ich bin auch auf dieses Problem gestoßen. Ich musste meiner SQL-Anweisung "LOCAL" hinzufügen.

Dies gibt beispielsweise das Berechtigungsproblem:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Fügen Sie Ihrer Anweisung "LOCAL" hinzu, und das Problem mit den Berechtigungen sollte behoben sein. Wie so:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

178
jeremysawesome

Ich hatte dieses Problem. Ich habe mich umgesehen und keine befriedigende Antwort gefunden. Ich fasse unten die Ergebnisse meiner Suche zusammen.

Der Fehler "Zugriff verweigert" kann Folgendes bedeuten:

  • 'user' @ 'localhost' hat nicht die Berechtigung FILE (GRANT FILE on *.* to [email protected]'localhost'); oder,
  • die Datei, die Sie laden möchten, existiert nicht auf dem Computer, auf dem MySQL Server ausgeführt wird (wenn LOAD DATA INFILE verwendet wird). 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 weltweit lesbar (Sie benötigen die Datei nd alle übergeordneten Verzeichnisse, um weltweit lesbar zu sein: chmod 755 directory; und chmod 744 file.dat)
28

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.

18
shreyas-agrawal

Stellen Sie sicher, dass Ihr MySQL-Benutzer über die Berechtigung FILE verfügt.

Wenn Sie auf Shared Web Hosting sind, besteht die Möglichkeit, dass dies von Ihrem Hosting-Anbieter blockiert wird.

9
tanerkay

Die Saite aus Lyon hat mir einen sehr guten Tipp gegeben: 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();
3
Matthias Wuttke

Das passierte auch mir 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 LOCAL-Option 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
Giacomo

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
  • variable secure_file_priv deaktivieren (meine Datei wurde vom Webserver in den Ordner/tmp hochgeladen, der natürlich nicht das gesicherte Verzeichnis von myslq/var/lib/mysql-file ist)

Informationen zu diesem dritten Punkt finden Sie unter: https://dev.mysql.com/doc/refman/5.7/de/server-system-variables.html#sysvar_secure_file_priv

BR,

ANZEIGE

2
user7996813

Ich habe festgestellt, dass das Laden von MySQL-Tabellen schnell und problemlos vonstatten gehen kann (ich habe python/Django model manager scripts) verwendet):

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

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

2) Kopfzeilen (erste Zeile) aus csv entfernen und dann laden (wenn Sie das LOCAL vergessen, erhalten Sie "# 1045 - Zugriff verweigert für Benutzer 'user' @ 'localhost' (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à!

0
magula