J'apprends MySQL et j'essaie d'utiliser une clause LOAD DATA
. Quand je l'ai utilisé comme ci-dessous:
LOAD DATA INFILE "text.txt" INTO table mytable;
J'ai eu l'erreur suivante:
Le serveur MySQL s'exécute avec l'option --secure-file-priv, il ne peut donc pas exécuter cette instruction.
Comment puis-je aborder cette erreur?
J'ai vérifié ne autre question sur le même message d'erreur , mais je ne trouve toujours pas de solution.
J'utilise MySQL 5.6
Cela fonctionne comme prévu. Votre serveur MySQL a été démarré avec l'option - secure-file-priv qui permet de limiter les répertoires dans lesquels vous pouvez charger des fichiers avec LOAD DATA INFILE
.
Vous pouvez utiliser SHOW VARIABLES LIKE "secure_file_priv";
pour voir le répertoire qui a été configuré.
Vous avez deux options:
secure-file-priv
.secure-file-priv
. Cela doit être retiré du démarrage et ne peut pas être modifié dynamiquement. Pour ce faire, vérifiez vos paramètres de démarrage MySQL (selon la plate-forme) et my.ini.J'ai eu le même problème. J'ai finalement résolu en utilisant l'option LOCAL
dans la commande
LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;
Vous pouvez trouver plus d'infos ici http://dev.mysql.com/doc/refman/5.7/en/load-data.html
Si LOCAL est spécifié, le fichier est lu par le programme client sur l'hôte client et envoyé au serveur. Le fichier peut être donné en tant que chemin complet pour spécifier son emplacement exact. S'il est donné sous forme de nom de chemin relatif, le nom est interprété par rapport au répertoire dans lequel le programme client a été lancé.
Sur Ubuntu 14 et Mysql 5.5.53, ce paramètre semble être activé par défaut. Pour le désactiver, vous devez ajouter secure-file-priv = ""
à votre fichier my.cnf sous le groupe de configuration mysqld. par exemple:-
[mysqld]
secure-file-priv = ""
Je travaille sur MySQL 5.7.11 sur Debian, la commande qui m'a permis de voir le répertoire est la suivante:
mysql> SELECT @@global.secure_file_priv;
Si le fichier est local sur votre machine, utilisez le LOCAL dans votre commande
LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
Voici ce qui a fonctionné pour moi dans Windows 7 pour désactiver secure-file-priv
(Option n ° 2 de réponse de vh ):
services.msc
.C:\ProgramData\MySQL\MySQL Server 5.6
(ProgramData
était un dossier caché dans mon cas).my.ini
dans le Bloc-notes.secure-file-priv=""
services.msc
.@vhu
J'ai fait le SHOW VARIABLES LIKE "secure_file_priv";
et il a renvoyé C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\
alors quand je l'ai branché, cela ne fonctionnait toujours pas.
Quand je suis allé directement dans le fichier my.ini, j'ai découvert que le chemin était formaté différemment: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads
Puis quand je l'ai couru avec ça, ça a fonctionné. La seule différence est la direction des barres obliques.
J'ai eu le même problème avec 'Secure-File-Priv'. Les commentaires dans le fichier .ini ne fonctionnaient pas, pas plus que le déplacement de fichier dans le répertoire spécifié par 'secure-file-priv'.
Enfin, comme le suggérait dbc, rendre "secure-file-priv" égal à une chaîne vide fonctionnait. Donc, si quelqu'un est bloqué après avoir essayé les réponses ci-dessus, nous espérons que cela vous aidera.
La chose qui a fonctionné pour moi:
secure-file-priv
.Pour trouver ce type:
mysql> affiche des variables comme "secure_file_priv";
local_infile = 1
.Faites cela en tapant:
mysql> affiche des variables comme "local_infile";
Si vous obtenez:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile | OFF |
+---------------+-------+
Puis définissez-le sur une frappe:
mysql> set global local_infile = 1;
mysql> charge data infile "C:/ProgramData/MySQL/Serveur MySQL 8.0/Uploads/fichier.txt" dans la table test;
J'ai eu toutes sortes de problèmes avec ça. Je changeais mon.cnf et toutes sortes de choses folles que d'autres versions de ce problème essayaient de montrer.
Ce qui a fonctionné pour moi:
L'erreur que je devenais
The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
J'ai pu résoudre ce problème en ouvrant /usr/local/mysql/support-files/mysql.server et en modifiant la ligne suivante:
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
à
$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --secure-file-priv="" $other_args >/dev/null &
wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?
J'ai eu ce problème sous Windows 10. "--secure-file-priv dans MySQL" Pour résoudre ce problème, j’ai fait ce qui suit.
Le serveur a démarré comme prévu.
Si vous utilisez Ubuntu, vous devrez peut-être également configurer Apparmor pour permettre à MySQL d'écrire dans votre dossier, par exemple. voici ma configuration:
Ajoutez cette ligne au fichier /etc/apparmor.d/usr.sbin.mysqld:
/var/lib/mysql-files/* rw
Ajoutez ensuite ces 2 lignes de configuration aux sections /etc/mysql/my.cnf:
[client]
loose-local-infile = 1
[mysqld]
secure-file-priv = ""
Voici mon SQL:
select id from blahs into outfile '/var/lib/mysql-files/blahs';
Cela a fonctionné pour moi. Bonne chance!
MySQL utilise cette variable système pour contrôler où vous pouvez importer vos fichiers
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | NULL |
+------------------+-------+
Le problème est donc de savoir comment changer les variables système telles que secure_file_priv
.
mysqld
Sudo mysqld_safe --secure_file_priv=""
maintenant vous pouvez voir comme ça:
mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| secure_file_priv | |
+------------------+-------+
Pour MySQL version 8.0, vous pouvez faire ceci:
Cela a fonctionné pour moi sur Mac High Sierra