Réponses:
Je viens de rencontrer ce problème également. J'ai dû ajouter LOCAL
à mon instruction SQL.
Par exemple, cela pose le problème d'autorisation:
LOAD DATA INFILE '{$file}' INTO TABLE {$table}
Ajoutez LOCAL
à votre déclaration et le problème des autorisations devrait disparaître. Ainsi:
LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}
--local-infile
option.
J'ai eu ce problème. J'ai cherché partout 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é peut signifier que:
GRANT FILE on *.* to user@'localhost'
); ou,Essayez d'utiliser cette commande:
load data local infile 'home/data.txt' into table customer;
Cela devrait fonctionner. Cela a fonctionné dans mon cas.
ERROR 1148 (42000): The used command is not allowed with this MySQL version
La chaîne de Lyon m'a donné un très bon conseil: sous Windows, il faut utiliser des slahes 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();
J'ai rencontré le même problème et je l'ai résolu en suivant ces étapes:
Pour ce 3ème point, vous pouvez vous référer à: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv
BR,
UN D
Cela m'est arrivé aussi et malgré avoir suivi toutes les étapes décrites par Yamir dans son message, je n'ai pas pu le faire fonctionner.
Le fichier se trouvait dans /tmp/test.csv avec 777 autorisations. L'utilisateur MySQL avait des autorisations de fichier, l'option LOCAL n'était pas autorisée par ma version MySQL, donc j'étais bloqué.
Enfin, j'ai pu résoudre le problème en exécutant:
sudo chown mysql:mysql /tmp/test.csv
J'en ai trouvé un facile si vous utilisez la ligne de commande
Se connecter en tant quemysql -u[username] -p[password] --local-infile
puis SET GLOBAL local_infile = 1;
sélectionnez votre base de données en use [db_name]
et enfin 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;
SET GLOBAL local_infile = 1;
ne semble pas fonctionner dans RDS, mais de toute façon, cela a --local-infile
fait l'affaire
J'ai découvert que le chargement de tables MySQL pouvait être rapide et indolore (j'utilisais des scripts de gestionnaire de modèles python / Django):
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 (si vous oubliez le LOCAL, vous obtiendrez «# 1045 - Accès refusé pour l'utilisateur 'user' @ 'localhost' (en utilisant le mot de passe: OUI)»):
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à!
Cela signifie probablement que le mot de passe que vous avez fourni 'user'@'localhost'
est incorrect.