web-dev-qa-db-fra.com

LOAD DATA INFILE Code d'erreur: 13

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

45
user292049

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.

96
Nelson

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 .

51
Matthias Munz

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.

19
JonVD

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é

13
Ankit Sharma

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!

5
Avnish Mehta

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.

5
Flem

Si vous utilisez Fedora/RHEL/CentOO, vous pouvez désactiver SELinux temporairement:

setenforce 0

Chargez vos données puis réactivez-les:

setenforce 1
2
bryant1410

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).

1
solo

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

1
Arnaud Bouchot

J'ai rencontré le même problème et appliqué les solutions ci-dessus.

Tout d’abord, mon environnement de test est le suivant

  • Ubuntu 14.04.3 64bit
  • mysql Ver 14.14 Distrib 5.5.47, pour debian-linux-gnu (x86_64) en utilisant readline 6.3 (installé par la seule commande 'Sudo apt-get install ...')

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

  • lance le client mysql avec l'option --in-file = 1
  • utilisez LOAD DATA LOCAL INFILE au lieu de LOAD DATA INFILE
  • 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"

    • /maison
    • / home/hongsoog
    • / home/hongsoog/étude/mysql
    • /home/hongsoog/study/mysql/member.data

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.

0
Hongsoog

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 ';'
0
MMSA

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)
0
Ashish Gupta
  1. checkout cette variable système 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
  1. changez votre fichier csv en dossier /tmp afin que mysqls puisse le lire.

  2. 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
0
saltfish

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é.

0
J R

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

0
shaluotuo