121 votes

accès refusé pour charger des données dans un fichier dans MySQL

J'utilise tout le temps des requêtes MySQL en PHP, mais lorsque j'essaie de

LOAD DATA INFILE

J'obtiens l'erreur suivante

1045 - Accès refusé pour l'utilisateur 'user'@'localhost' (avec mot de passe : YES)

Quelqu'un sait-il ce que cela signifie ?

226voto

jeremysawesome Points 2539

Je viens également de rencontrer ce problème. J'ai dû ajouter LOCAL à ma déclaration SQL.

Par exemple, cela donne le problème de la permission :

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

Ajouter LOCAL à votre déclaration et le problème des permissions devrait disparaître. Comme ça :

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

14 votes

Ceci fait une chose différente. Elle télécharge votre fichier sur le serveur dans un répertoire temporaire. C'est parfois nécessaire, mais si l'infile est déjà sur le serveur MySQL, vous ne faites que du travail redondant.

1 votes

Je faisais suivre le port du serveur de base de données par ssh et je suppose qu'il cherchait le fichier sur le serveur de base de données distant sans la partie LOCAL.

2 votes

@jeremysawesome pour moi cela produit l'erreur suivante : Code d'erreur : 1148 La commande utilisée n'est pas autorisée avec cette version de MySQL. J'ai essayé quelques réponses à ce problème comme la modification du fichier mysql en local-infile=1 et cela a également échoué.

35voto

Yamir Encarnacion Points 143

J'ai eu ce problème. J'ai fait des recherches 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 :

  • L'utilisateur '@' localhost' ne possède 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 exécutant le serveur mysql (si vous utilisez LOAD DATA INFILE) ; ou,
  • le fichier que vous essayez de charger n'existe pas sur votre machine locale (si vous utilisez LOAD DATA LOCAL INFILE) ; ou,
  • le fichier que vous essayez de charger n'est pas lisible dans le monde entier (vous avez besoin du fichier y tous les répertoires parents doivent être lisibles par le monde entier : chmod 755 directory ; et, chmod 744 file.dat)

0 votes

+1 : Cela a fonctionné pour moi : le fichier que vous essayez de charger n'est pas lisible par le monde entier (le fichier et tous les répertoires parents doivent être lisibles par le monde entier : chmod 755 directory ; et, chmod 744 file.dat) . Je n'avais pas changé les permissions sur tous mes répertoires.

1 votes

L'utilisateur Tatiana fait remarquer que vous ne pouvez pas accorder le privilège FILE par base de données, mais uniquement pour l'ensemble du serveur. La commande d'octroi serait "GRANT FILE on . à l'utilisateur@'localhost' IDENTIFIÉ PAR 'password') ;"

4 votes

@JAL Je pense que vous voulez dire "GRANT FILE ON *.* to user ...". -- les caractères d'astérisque ont probablement été supprimés.

10voto

enbuyukfener Points 1219

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

Si vous êtes sur un hébergement web partagé, il y a une chance que cela soit bloqué par votre fournisseur d'hébergement.

0 votes

Sur un hébergement web partagé : serait-il utile d'utiliser "LOAD DATA LOCAL INFILE" ?

3voto

Matthias Wuttke Points 845

La chaîne de Lyon m'a donné un très bon conseil : sous Windows, il faut utiliser des slahs et non des backslashes. 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();

-6voto

David Grant Points 8477

Cela signifie probablement que le mot de passe que vous avez fourni pour 'user'@'localhost' est incorrecte.

1 votes

Je ne pense pas. Je peux faire d'autres requêtes avec le même mot de passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X