web-dev-qa-db-fra.com

accès refusé pour les données de chargement dans MySQL

J'utilise des requêtes MySQL tout le temps en PHP, mais lorsque j'essaie LOAD DATA INFILE, j'obtiens le message d'erreur suivant #1045 - Access denied for user 'user'@'localhost' (using password: YES) Quelqu'un sait-il ce que cela signifie?

94
Brian

Je viens de rencontrer ce problème aussi. Je devais ajouter "LOCAL" à mon instruction SQL.

Par exemple, cela donne le problème de permission:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}

Ajouter "LOCAL" à votre déclaration et le problème des autorisations devrait disparaître. Ainsi:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

178
jeremysawesome

J'ai eu ce problème. J'ai cherché autour et je n'ai pas trouvé de réponse satisfaisante. Je résume ci-dessous les résultats de mes recherches.

L'erreur d'accès refusé pourrait signifier que:

  • 'utilisateur' @ 'localhost' n'a pas le privilège FILE (GRANT FILE on *.* to user@'localhost'); ou,
  • le fichier que vous essayez de charger n'existe pas sur la machine qui exécute le serveur mysql (si vous utilisez LOAD DATA INFILE); ou,
  • le fichier que vous essayez de charger n'existe pas sur votre ordinateur local (si vous utilisez LOAD DATA LOCAL INFILE); ou,
  • le fichier que vous essayez de charger n'est pas lisible par tout le monde (vous avez besoin du fichier et tous les répertoires parents doivent être lisibles par tout le monde: chmod 755 directory; et, chmod 744 file.dat)
28

Essayez d'utiliser cette commande:

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

Cela devrait marcher. Cela a fonctionné dans mon cas.

18
shreyas-agrawal

Assurez-vous que votre utilisateur MySQL dispose du privilège FILE.

Si vous utilisez un hébergement Web partagé, il est possible que votre fournisseur d’hébergement le bloque.

9
tanerkay

La chaîne de Lyon m'a donné un très bon conseil: Sous Windows, nous devons utiliser des slahes et non des antislash. Ce code fonctionne pour moi:

    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

Cela m'est aussi arrivé et bien que j'aie suivi toutes les étapes décrites par Yamir dans son message, je n'ai pas réussi à le faire fonctionner.

Le fichier se trouvait dans /tmp/test.csv avec 777 autorisations. L'utilisateur MySQL avait des autorisations de fichiers, l'option LOCAL n'était pas autorisée par ma version de MySQL, donc j'étais bloqué.

Enfin, j'ai pu résoudre le problème en exécutant:

Sudo chown mysql:mysql /tmp/test.csv
2
Giacomo

J'ai rencontré le même problème et le résoudre en suivant ces étapes:

  • activer la variable load_infile
  • autorisation de fichier grand pour mon utilisateur mysql personnalisé
  • désactiver la variable secure_file_priv (mon fichier a été chargé par le serveur Web dans le dossier/tmp, qui n'est bien sûr pas le répertoire sécurisé de myslq/var/lib/mysql-file)

Pour ce 3ème point, vous pouvez vous référer à: https://dev.mysql.com/doc/refman/5.7/fr/server-system-variables.html#sysvar_secure_file_priv

BR,

UN D

2
user7996813

J'ai découvert que charger des tables MySQL peut être rapide et sans douleur (J'utilisais python/Django du gestionnaire de modèles)):

1) créer une table avec toutes les colonnes VARCHAR (n) NULL par exemple:

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

2) supprimez les en-têtes (première ligne) de csv, puis chargez-les (si vous oubliez le LOCAL, vous obtiendrez "# 1045 - Accès refusé pour l'utilisateur 'utilisateur' @ 'localhost' (en utilisant le mot de passe: 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) modifier les colonnes:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!

0
magula