À 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é.
my.cnf
chemin est/etc/mysql/my.cnf
dans ma machine (AWS EC2).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:
Puis ajouter:
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.
la source
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 plussudo 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
la source
J'ai résolu ce problème sur MySQL 8.0.11 avec la commande de terminal mysql:
Je veux dire que je me suis connecté en premier avec l'habituel:
Après cela, vous pouvez voir l'état avec la commande:
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.
la source
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 maisERROR 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 commandeouvrir 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:
la source
Voir l'image ci-dessous ...
J'ai ajouté
--local-infile=1
à la commande mysql normalemysql -u root -p
La ligne totale serait donc:
la source
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):
la source
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):
ou orienté objet
la source
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 source
Une autre façon consiste à utiliser le
mysqlimport
programme client.Vous l'appelez comme suit:
Cela génère une
LOAD DATA
instruction qui se chargetableName.txt
dans latableName
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 commetableName.1.txt
,tableName.2.txt
, ..., etc., par exemple.la source
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:
la source
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)
puis:
la source
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;".
la source
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:
Ensuite, si je veux "recréer" le bogue, je redémarre simplement le service apache:
Ce qui peut ensuite être corrigé à nouveau en entrant la commande suivante:
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.
Valide dans les distributions basées sur RedHat
la source
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 enpercona
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 tapantmysql -u root -p
puis le mot de passe. Essayez d'exécuter la commandeLOAD 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.
la source
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 .
la source
Ajoutez les
local_infile
deuxclient
et lamysqld
section.Testé dans MySQL 8.x à la fois sous Windows et Linux.
la source
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.
la source