Réponses:
À 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é.
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.mysqld
Mettez simplement à jour votre et rechargez le service apparmor.
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.
Ubuntu 14.04.2 LTS not working
.
/mysql/my.cnf
n'existe pas par défaut. Créez simplement le répertoire et le fichier et collez ces lignes dans le fichier.
/etc/mysql/conf.d/enable-local-infile.cnf
N'oubliez pas non plus sudo service mysql restart
après avoir fait le changement de configuration pour qu'il prenne effet.
Remplacez le pilote php5-mysql par le pilote natif
Sur Debian
apt-get install php5-mysqlnd
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.
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.
8.0.12 MySQL Community Server
sur Windows.
SET GLOBAL local_infile = true;
commande mais ERROR 1148 (42000): The used command is not allowed with this MySQL version
j'obtiens toujours la même erreur mais la connexion à mysql avec --load-infile = 1 a fonctionnémysql --local-infile=1 -u root -p
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 infile
commande 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 infile
commande (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';
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
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.
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,
},
}
}
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:
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);
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
Une autre façon consiste à utiliser le mysqlimport
programme client.
Vous l'appelez comme suit:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
Cela génère une LOAD DATA
instruction qui se charge tableName.txt
dans la tableName
table.
Gardez à l'esprit les points suivants:
mysqlimport
dé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.
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.
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"
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
Pour ceux d'entre vous qui recherchent des réponses pour faire fonctionner LOAD DATA LOCAL
INFILE comme moi, cela pourrait probablement fonctionner. Eh bien, cela a fonctionné pour moi, alors voilà. Installez en percona
tant 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 à terminal
et en tapant mysql -u root -p
puis le mot de passe. Essayez d'exécuter la commande LOAD DATA LOCAL INFILE
maintenant. J'espère que cela fonctionne :)
BTW je travaillais sur Rails 2.3 avec Ruby 1.9.3 sur Ubuntu 12.04.
Ajoutez les local_infile
deux client
et la mysqld
section.
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
Testé dans MySQL 8.x à la fois sous Windows et Linux.
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.
my.cnf
chemin est/etc/mysql/my.cnf
dans ma machine (AWS EC2).