MySQL: activer LOAD DATA LOCAL INFILE

127

J'exécute Mysql 5.5 sur Ubuntu 12 LTS. Comment activer LOAD DATA LOCAL INFILE dans my.cnf?

J'ai essayé d'ajouter local-infile dans ma configuration à divers endroits mais j'obtiens toujours le message "La commande utilisée n'est pas autorisée avec cette version de MySQL"

Krt_Malta
la source

Réponses:

197

À partir de la page de manuel MySQL 5.5:

LOCAL ne fonctionne que si votre serveur et votre client ont tous deux été configurés pour le permettre. Par exemple, si mysqld a été démarré avec --local-infile = 0, LOCAL ne fonctionne pas. Voir Section 6.1.6, «Problèmes de sécurité avec LOAD DATA LOCAL».

Vous devez définir l'option:

local-infile=1

dans votre entrée [mysql] du fichier my.cnf ou appelez le client mysql avec l' option --local-infile :

mysql --local-infile -uroot -pyourpwd yourdbname

Vous devez vous assurer que le même paramètre est également défini dans votre section [mysqld] pour activer le côté serveur de fonctionnalités "local infile".

C'est une restriction de sécurité.

dAm2K
la source
4
THX. btw, le my.cnfchemin est /etc/mysql/my.cnfdans ma machine (AWS EC2).
SparkAndShine
Fait intéressant, le fichier my.cnf était pour moi dans le répertoire / etc.
SgtRock
Toutes les idées sur où aller si cela échoue toujours. J'ai ajouté local-infile = 1 à mon fichier.cnf sous [client], [mysqld] et [mysql] et utilisé des combinaisons de ceux-ci. Tout cela avec les mêmes résultats. J'ai essayé de redémarrer Workbench mais pas de chance. J'ai également arrêté et démarré mySQL workbench entre chaque changement.
OrwellHindenberg
2
une mise à jour de mySQL vers 6.2.5 a résolu ce problème pour moi
OrwellHindenberg
La réponse va dans la bonne direction. Mais pour ceux qui sont confrontés à ce problème, voici un autre piège. Si vous avez activé Apparmor sur votre système et que le problème persiste, vérifiez le syslog pour voir si le démon mysqld est bloqué. J'ai eu ce problème: apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33. La solution est très simple. /etc/apparmor.d/local/usr.sbin.mysqldMettez simplement à jour votre et rechargez le service apparmor.
Leo
60

Le fichier my.cnf que vous devez modifier est le fichier /etc/mysql/my.cnf . Juste:

sudo nano /etc/mysql/my.cnf

Puis ajouter:

[mysqld]
local-infile 

[mysql]
local-infile 

Les en-têtes [mysqld] et [mysql] sont déjà donnés, il suffit de les localiser dans le fichier et d'ajouter local-infile sous chacun d'eux.

Cela fonctionne pour moi sur MySQL 5.5 sur Ubuntu 12.04 LTS.

hlosukwakha
la source
1
Cela m'a définitivement résolu avec Ubuntu 12.04.
John Fiala
4
Je peux également confirmer Ubuntu 14.04.2 LTS not working.
Ain Tohvri
Fonctionne aussi pour Mac. Pour les utilisateurs Mac, /mysql/my.cnfn'existe pas par défaut. Créez simplement le répertoire et le fichier et collez ces lignes dans le fichier.
Zheng Liu
Si vous ne voulez pas que cette configuration soit écrasée lorsque mysql est mis à jour, vous devriez le mettre dans /etc/mysql/conf.d/enable-local-infile.cnf N'oubliez pas non plus sudo service mysql restartaprès avoir fait le changement de configuration pour qu'il prenne effet.
Stephen Ostermiller
C'est la bonne solution. La solution la plus élevée ne mentionne pas que vous devez mettre [mysqld] en premier avant la ligne local-infile.
user3260912
30

Remplacez le pilote php5-mysql par le pilote natif

Sur Debian

apt-get install php5-mysqlnd
BeniSK
la source
Cela a fonctionné! En utilisant le stock aws 12.04 ubuntu, j'avais besoin de «local» car je me connecte à RDS. Mille mercis!
James Bowler
Merci beaucoup, cette solution a fonctionné pour moi. J'ai posé la question stackoverflow.com/questions/36526102/…
user75472
No success ubuntu 12.04
Zbyszek
un autre client heureux! ubuntu 14.04 mysql 5.7
nodoze
27

J'ai résolu ce problème sur MySQL 8.0.11 avec la commande de terminal mysql:

SET GLOBAL local_infile = true;

Je veux dire que je me suis connecté en premier avec l'habituel:

mysql -u user -p*

Après cela, vous pouvez voir l'état avec la commande:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

Il devrait être allumé. Je n'écrirai pas sur la sécurité liée au chargement de fichiers locaux dans la base de données ici.

Oleksiy Muzalyev
la source
J'ai essayé de nombreuses autres solutions, mais seule la commande SET GLOBAL local_infile = true; fonctionne. La version de MySQL est la 8.0.12. C'est peut-être la dernière solution. Merci beaucoup.
mathsyouth
1
Malheureusement, la variable est à nouveau désactivée après le redémarrage du serveur.
Pedro
Mohit, je l'ai résolu d'une manière ou d'une autre, car maintenant la variable globale 'local_infile' est toujours activée, même après le redémarrage. Et il semble que je n'ai pas utilisé mon fichier.cnf pour cela. Pourriez-vous, s'il vous plaît, essayer de vous connecter à PhpMyAdmin, dernière version, en tant que root, aller dans la section Variables, rechercher 'local_infile', puis cliquer sur Modifier, le changer sur ON, et enfin appuyer sur Entrée. Cela a-t-il fonctionné?
Oleksiy Muzalyev
2
Seule cette réponse a fonctionné pour moi 8.0.12 MySQL Community Serversur Windows.
endo64
MySQL 8.0.16 est installé sur le serveur Windows 2016, j'ai exécuté la SET GLOBAL local_infile = true;commande mais ERROR 1148 (42000): The used command is not allowed with this MySQL versionj'obtiens toujours la même erreur mais la connexion à mysql avec --load-infile = 1 a fonctionnémysql --local-infile=1 -u root -p
Junior
13

dans le cas où votre saveur de mysql sur ubuntu ne fonctionne en aucun cas et que vous obtenez toujours l'erreur 1148, vous pouvez exécuter la load data infilecommande via la ligne de commande

ouvrir une fenêtre de terminal

courir mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

il vous sera demandé d'insérer le mot de passe mysqluser

vous exécuterez MySQLMonitor et votre invite de commande sera mysql>

exécutez votre load data infilecommande (n'oubliez pas de terminer par un point-virgule ; )

comme ça:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';
Tony Gil
la source
9

Voir l'image ci-dessous ...

J'ai ajouté --local-infile=1à la commande mysql normale mysql -u root -p

La ligne totale serait donc:

mysql --local-infile = 1 -u racine -p

entrez la description de l'image ici

Jagadeesh Pulamarasetti
la source
Cela a fonctionné pour moi quand ce SET GLOBAL ..n'était pas le cas. Une commande 'source' ( \. file.sql) démarre- t-elle d'une manière ou d'une autre une nouvelle session ou la réinitialise-t-elle? Je n'ai pas essayé de mettre le paramètre dans le script mmy sql cependant.
toddkaufmann
5

De plus, pour les autres lecteurs, si vous essayez de le faire dans Django ET que votre serveur autorise local_infile (vous pouvez vérifier en tapant SHOW VARIABLES via un client mysql), vous pouvez l'ajouter à votre fichier settings.py (puisque python MySQLdb ne le fait pas) t par défaut lire le fichier .my.cnf):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}
brfox
la source
3

Vous devez faire attention à la façon dont vous établissez votre connexion mysqli. Le mérite de cette solution revient à Jorge Albarenque, source

Pour y remédier, je devais:

  • Ajoutez local-infile = 1 aux sections [mysqld] et [mysql] de my.cnf (comme expliqué dans les commentaires ci-dessus)
  • Utilisez la fonction mysqli_real_connect ( documentation PHP ).

Le hic, c'est qu'avec cette fonction, vous pouvez explicitement activer la prise en charge de LOAD DATA LOCAL INFILE. Par exemple (style procédural):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

ou orienté objet

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);
sieppl
la source
1
@Mask Impossible de confirmer. Ma solution fonctionne sur 5.5.46 (Ubuntu)
sieppl
3

si votre fichier csv est situé de la même manière que db, vous devez supprimer LOCAL dans LOAD DATA INFILE , ou vous obtiendrez l'erreur

La commande utilisée n'est pas autorisée avec cette version de MySQL

wingoo
la source
Cela l'a fait pour moi, mais j'ai également dû suivre la réponse de Nelson ici
Dominic
1

Une autre façon consiste à utiliser le mysqlimportprogramme client.

Vous l'appelez comme suit:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

Cela génère une LOAD DATAinstruction qui se charge tableName.txtdans la tableNametable.

Gardez à l'esprit les points suivants:

mysqlimportdétermine le nom de la table à partir du fichier que vous fournissez; en utilisant tout le texte depuis le début du nom de fichier jusqu'à la première période comme nom de table. Donc, si vous souhaitez charger plusieurs fichiers à la même table , vous pouvez les distinguer comme tableName.1.txt, tableName.2.txt, ..., etc., par exemple.

Schalk
la source
1

Cela a été un peu bizarre pour moi, du jour au lendemain, les scripts qui fonctionnent depuis des jours cessent de fonctionner. Il n'y avait pas de version plus récente de mysql ou de toute sorte de mise à jour mais j'obtenais la même erreur, donc je donne un dernier essai au fichier CSV et remarque que la fin des lignes utilisait \ n au lieu de l'attendu (selon mon script ) \ r \ n donc je l'enregistre avec le bon EOL et relance le script sans aucun problème.

Je pense que c'est un peu étrange que mysql me dise que la commande utilisée n'est pas autorisée avec cette version de MySQL car la raison était complètement différente.

Ma commande de travail ressemble à ceci:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.
Oscar Nevarez
la source
1

J'ai utilisé la méthode ci-dessous, qui ne nécessite aucun changement de configuration , testée sur mysql-5.5.51-winx64 et 5.5.50-MariaDB:

mettre 'load data ...' dans le fichier .sql (ex: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

puis:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"
Jawad Al Shaikh
la source
1

Dans le cas où Mysql 5.7 vous pouvez utiliser "show global variables comme" local_infile ";" qui donnera le statut de fichier local, vous pouvez l'activer en utilisant "set global local_infile = ON;".

Midhunlal
la source
0

Ok, quelque chose d'étrange se passe ici. Pour que cela fonctionne, vous n'avez PAS besoin de modifier la configuration dans /etc/mysql/my.cnf. Tout ce que vous avez à faire est de redémarrer le service mysql actuel dans le terminal:

sudo service mysql restart

Ensuite, si je veux "recréer" le bogue, je redémarre simplement le service apache:

sudo service apache2 restart

Ce qui peut ensuite être corrigé à nouveau en entrant la commande suivante:

sudo service mysql restart

Donc, il semble que l'apache2 fait quelque chose pour ne pas autoriser cette fonctionnalité au démarrage (qui est ensuite inversée / corrigée si vous redémarrez le service mysql).

Valide dans les distributions basées sur Debian.

service mysqld restart
service httpd restart

Valide dans les distributions basées sur RedHat

Bradymiller
la source
0

Pour ceux d'entre vous qui recherchent des réponses pour faire fonctionner LOAD DATA LOCALINFILE comme moi, cela pourrait probablement fonctionner. Eh bien, cela a fonctionné pour moi, alors voilà. Installez en perconatant que serveur et client mysql en suivant les étapes du lien. Un mot de passe vous sera demandé lors de l'installation, alors fournissez-en un dont vous vous souviendrez et utiliserez-le plus tard. Une fois l'installation terminée, redémarrez votre système et testez si le serveur est opérationnel en accédant à terminalet en tapant mysql -u root -ppuis le mot de passe. Essayez d'exécuter la commande LOAD DATA LOCAL INFILEmaintenant. J'espère que cela fonctionne :)

BTW je travaillais sur Rails 2.3 avec Ruby 1.9.3 sur Ubuntu 12.04.

Varun Natraaj
la source
0

Tous: Évidemment, cela fonctionne comme prévu. Veuillez consulter la nouvelle référence datée du 2019-7-23, Section 6.1.6, Problèmes de sécurité avec LOAD DATA LOCAL .

viejo
la source
0

Ajoutez les local_infiledeux clientet la mysqldsection.

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

Testé dans MySQL 8.x à la fois sous Windows et Linux.

Madan Sapkota
la source
0

J'utilise xampp v3.2.4 et le serveur mysql 8.0.20.

J'ai ajouté local-infile=1à [mysql]et [mysqld]dans le fichier « my.ini ». Le fichier se trouve dans "C: \ xampp \ mysql \ bin \ my.ini".

Ensuite, j'ai inséré les données du fichier csv en utilisant le code suivant LOAD DATA INFILE .... Il est important de déplacer LOCAL. Sinon, cela ne fonctionnera pas.

Merci pour toutes les suggestions ci-dessus. Une combinaison a finalement fonctionné pour moi.

user7849670
la source