Dans mon MySQL distant, lorsque j'essaie d'exécuter cette requête, je reçois le code d'erreur MySQL: 13.
Requête -
LOAD DATA INFILE
'/httpdocs/.../.../testFile.csv'
INTO TABLE table_temp
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r \\n'
(sku, qty);
Code d'erreur: 13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)
une. La base de données userlogin a tous les privilèges d’octroi.
CREATE USER 'userName'@'%' IDENTIFIED BY '************';
GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%';
b. J'ai également défini l'autorisation de fichier et de dossier sur chmod 777 (rwxrwxrwx) en utilisant l'outil FTP
Je sais que ce message est ancien, mais cela apparaît toujours dans les résultats de recherche. Je ne pouvais pas trouver la solution à ce problème en ligne, alors j'ai fini par le découvrir moi-même. Si vous utilisez Ubuntu, il existe un programme appelé "Apparmor" qui empêche MySQL de voir le fichier. Voici ce que vous devez faire si vous voulez que MySQL puisse lire les fichiers du répertoire "tmp":
Sudo vim /etc/apparmor.d/usr.sbin.mysqld
Une fois que vous êtes dans le fichier, vous allez voir un tas de répertoires que MySQL peut utiliser. Ajoutez la ligne /tmp/** rwk
au fichier (je ne suis pas sûr que cela importe où, mais voici un exemple de l'endroit où je l'ai mis):
/etc/mysql/*.pem r,
/etc/mysql/conf.d/ r,
/etc/mysql/conf.d/* r,
/etc/mysql/*.cnf r,
/usr/lib/mysql/plugin/ r,
/usr/lib/mysql/plugin/*.so* mr,
/usr/sbin/mysqld mr,
/usr/share/mysql/** r,
/var/log/mysql.log rw,
/var/log/mysql.err rw,
/var/lib/mysql/ r,
/var/lib/mysql/** rwk,
/tmp/** rwk,
/var/log/mysql/ r,
/var/log/mysql/* rw,
/var/run/mysqld/mysqld.pid w,
/var/run/mysqld/mysqld.sock w,
/run/mysqld/mysqld.pid w,
/run/mysqld/mysqld.sock w,
Maintenant, tout ce que vous avez à faire est de recharger Apparmor:
Sudo /etc/init.d/apparmor reload
Notez que j'ai utilisé "vim", mais remplacez-le par n'importe quel éditeur de texte que vous savez utiliser.
Ajouter le mot clé 'LOCAL' à ma requête a fonctionné pour moi:
LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name
Une description détaillée du mot clé peut être trouvée ici .
C’est normalement un problème d’autorisations d’accès aux fichiers, mais je vois que vous avez déjà abordé cette question au point b, mais cela vaut la peine d’y revenir au cas où. Une autre option consiste à utiliser LOAD DATA LOCAL INFILE, qui résout bon nombre de ces problèmes d’autorisation d’accès aux fichiers. Pour utiliser cette méthode, vous devez d'abord copier le fichier localement (dans le dossier mysql). • Si LOCAL est spécifié, le fichier est lu par le programme client sur l'hôte client et envoyé au serveur.
Autorisations de répertoire insuffisantes
L'erreur dans cet exemple a résulté parce que le fichier que vous essayez l'importation ne se trouve pas dans un répertoire qui est lisible par l'utilisateur le serveur MySql est en cours d'exécution en tant que. Notez que tous les répertoires parents du répertoire le est dans le besoin d'être lisible par le Utilisateur MySql pour que cela fonctionne. Économie le fichier dans/tmp fonctionnera généralement en tant que Ceci est généralement lisible (et en écriture) par tous les utilisateurs. Le code d'erreur numéro est 13 . La source
MODIFIER:
N'oubliez pas que vous aurez besoin d'autorisations non seulement sur le dossier qui contient le fichier, mais également sur les répertoires supérieurs.
Exemple tiré de this post sur les forums MySql.
Si votre fichier était contenu dans la structure suivante: /Tmp/imports/site1/data.file
vous auriez besoin (je pense, 755 travaillé) de r + x pour 'autre' sur ces répertoires:
/ tmp
/ tmp/imports
Ainsi que les deux principaux:
/ tmp/imports/site1
/tmp/imports/site1/data.file
Vous avez besoin que le fichier et le répertoire soient lisibles par tout le monde . Des excuses si vous avez déjà essayé cette méthode, mais il peut être utile de revenir sur vos pas, ne vous faites jamais de double vérification.
Il y a une propriété dans le fichier de configuration mysql dans la section [mysqld] Avec le nom - tmpdir
par exemple:
tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux)
et la commande LOAD DATA INFILE
peut uniquement lire et écrire à cet emplacement.
ainsi, si vous placez votre fichier à cet emplacement, LOAD DATA INFILE
peut facilement lire/écrire n’importe quel fichier.
Une autre solution
nous pouvons importer des données en suivant la commande aussi
load data local infile
Dans ce cas, il n'est pas nécessaire de déplacer le fichier vers tmpdir, vous pouvez en indiquer le chemin absolu, mais pour exécuter cette commande, vous devez modifier la valeur d'un indicateur. Le drapeau est
--local-infile
vous pouvez changer sa valeur par la commande Invite tout en obtenant l'accès à mysql
mysql -u username -p --local-infile=1
À votre santé
L’erreur 13 n’est rien d’autre que les problèmes d’autorisations . Même si j’avais le même problème et que j’ai été incapable de charger les données dans la table mysql, le problème a été résolu moi-même.
Voici la solution:
Par défaut le
--local-infile est mis à la valeur 0
, pour pouvoir utiliser LOAD DATA LOCAL INFILE, il doit être activé.
Donc Démarrer mySQL comme ceci:
mysql -u nom d'utilisateur -p --local-infile
LOCAL INFILE sera activé au démarrage, ce qui évitera tout problème de l’utiliser!
J'utilise Ubuntu 12.04, je devais créer la table, puis effectuer l'une de ces tâches:
Utiliser local donne une erreur (mysql 5.5):
> LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ',';
ERROR 1148 (42000): The used command is not allowed with this MySQL version
La commande LOAD DATA INFILE est désactivée par défaut pour des raisons de sécurité, réactivez-la ici et elle devrait fonctionner: https://stackoverflow.com/a/16286112/445131
Vous pouvez importer le fichier csv en utilisant mysqlimport:
mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv
Notez que le fichier csv doit avoir le même nom avant l'extension que la table.
Si vous utilisez Fedora/RHEL/CentOO, vous pouvez désactiver SELinux temporairement:
setenforce 0
Chargez vos données puis réactivez-les:
setenforce 1
J'ai eu beaucoup de mal à résoudre ce problème, il y a deux choses à faire:
mettre à jour le fichier /etc/mysql/my.cnf
avec local-infile =1
à deux emplacements après les paragraphes [mysql]
(cela permet d'utiliser la commande LOCAL INFILE sql).
update via Sudo gedit /etc/apparmor.d/usr.sbin.mysqld
afin qu'apparmor vous permette d'écrire dans les fichiers spéciaux de /var/www/
en ajoutant les lignes suivantes:
/name of your directory/ r,
/name of your directory/* rw,
Le nom de votre répertoire peut être au format /var/www/toto/
(cela permet d’utiliser le répertoire où se trouvent vos fichiers).
pour les utilisateurs Ubuntu
J'utilise mysql 5.6.28 sur Ubuntu 15.10 et je viens de rencontrer exactement le même problème: tous les indicateurs nécessaires étaient dans my.cnf Tmpdir = /tmplocal-infile=1restarted mysql et moi obtiendrions quand même LOAD DATA INFILE Code d'erreur: 13
Tout comme Nelson a mentionné que le problème était "apparmor", une sorte de patronage de mysql à propos des permissions, j'ai ensuite trouvé la solution à l'aide de ceci tutoriel rapide et facile.
en gros, en supposant que votre répertoire tmp serait /tmp
:
Ajouter de nouvelles entrées tmpdir à /etc/apparmor.d/local/usr.sbin.mysqld
Sudo nano /etc/apparmor.d/local/usr.sbin.mysqld
*Ajoute ça
/tmp/ r,
/mnt/foo/tmp/** rw,
Recharger AppArmor
Sudo service apparmor reload
Redémarrez MySQL
Sudo service mysql restart
J'espère que ça va aider quelques Ubuntu-ers
J'ai rencontré le même problème et appliqué les solutions ci-dessus.
Tout d’abord, mon environnement de test est le suivant
Mes résultats de test sont
i) La solution AppArmor ne fonctionne que pour les cas/tmp.
ii) La solution suivante fonctionne sans solution AppArmor .. Je voudrais remercier Avnish Mehta pour sa réponse.
$ mysql -u root -p --in-file=1
...
mysql> LOAD DATA LOCAL INFILE '/home/hongsoog/study/mysql/member.dat'
-> INTO TABLE member_table;
Trois points importants sont
vérifie que tous les éléments path ont une permission de lecture universelle depuis le chemin d'accès au fichier de données /. Par exemple, le sous-chemin suivant devrait être lisible par tout le monde ou par un groupe mysql si INFILE vise "/home/hongsoog/study/mysql/memer.dat"
Lorsque vous démarrez le client mysql SANS l'option "--in-file = 1" et utilisez
LOAD DATA LOCAL INFILE ...,tu auras
ERREUR 1148 (42000): La commande utilisée n'est pas autorisée avec cette version de MySQL
En résumé, l'option "--in-file = 1" dans la commande client mysql et "LOAD DATA LOCAL INFILE ..." devraient aller de pair.
J'espère pouvoir aider quelqu'un.
Si vous utilisez XAMPP sur Mac, cela a fonctionné pour moi:
Déplacement du fichier CSV/TXT vers/Applications/XAMPP/xamppfiles/htdocs/as comme suit
LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'
VIEUX:
LOAD DATA INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
File '/home/root12/Downloads/task1.csv' not found (Errcode: 13 - Permission denied)
NOUVEAU TRAVAIL POUR MOI:
LOAD DATA LOCAL INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 500 rows affected, 284 warnings (1.24 sec)
Query OK, 5000 rows affected, 2846 warnings (1.24 sec)
local_infile
est sur SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | ON |
+---------------+-------+
Sinon, redémarrez mysqld
avec:
Sudo ./mysqld_safe --local-infile
changez votre fichier csv en dossier /tmp
afin que mysqls puisse le lire.
importer en db
mysql> LOAD DATA INFILE '/tmp/a.csv' INTO TABLE table_a FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 18 rows affected (0.17 sec)
Records: 18 Deleted: 0 Skipped: 0 Warnings: 0
Si vous utilisez cPanel ou phpmyadmin pour importer le CSV using LOAD DATA
, veillez à activer Enable Use LOCAL keyword
. Cela a fonctionné pour moi dans un environnement de serveur partagé.
load data infile '/root/source/in.txt' into table employee;
==> Code d'erreur: 13
load data infile '/tmp/in.txt' into table employee;
==> fonctionne
Version 6.6 de CentOS (version finale) - 5.5.32 MySQL Community Server (GPL)
quelque chose lié aux autorisations de fichiers Linux