web-dev-qa-db-fra.com

Comment dois-je m'attaquer à --secure-file-priv dans MySQL?

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

286
Mohit Bhasi

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:

  1. Déplacez votre fichier dans le répertoire spécifié par secure-file-priv.
  2. Désactiver 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.
383
vhu

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

204
Staza

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 = ""
98
Mustafa

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;
31
Carlos Med

Si le fichier est local sur votre machine, utilisez le LOCAL dans votre commande

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;
19
garyrgilbert

Voici ce qui a fonctionné pour moi dans Windows 7 pour désactiver secure-file-priv (Option n ° 2 de réponse de vh ):

  1. Arrêtez le service serveur MySQL en allant dans services.msc.
  2. Allez à C:\ProgramData\MySQL\MySQL Server 5.6 (ProgramData était un dossier caché dans mon cas).
  3. Ouvrez le fichier my.ini dans le Bloc-notes.
  4. Recherchez 'secure-file-priv'.
  5. Commentez la ligne en ajoutant '#' au début de la ligne. Pour MySQL Server 5.7.16 et supérieur, les commentaires ne fonctionneront pas. Vous devez définir une chaîne vide comme celle-ci - secure-file-priv=""
  6. Enregistrez le fichier.
  7. Démarrez le service serveur MySQL en allant dans services.msc.
15
Ramnath

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

9
wolfsshield

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.

7
Rsc Rsc

La chose qui a fonctionné pour moi:

  1. Placez votre fichier dans le dossier spécifié dans secure-file-priv.

Pour trouver ce type:

mysql> affiche des variables comme "secure_file_priv";


  1. Vérifiez si vous avez 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;


  1. Spécifiez le chemin complet de votre fichier. Dans mon cas:

mysql> charge data infile "C:/ProgramData/MySQL/Serveur MySQL 8.0/Uploads/fichier.txt" dans la table test;

4
Vinícius Souza

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=$?
3
notthehoff

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.

  1. Dans la recherche de fenêtres (en bas à gauche), j'ai tapé "powershell".
  2. Clic droit sur Powershell et exécuté en tant qu'administrateur.
  3. Navigué vers le fichier bin du serveur. (C:\Program Files\MySQL\MySQL Server 5.6\bin);
  4. Dactylographié ./mysqld
  5. Hit "entrer"

Le serveur a démarré comme prévu.

1
Jason Allshorn

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!

1
Kevin Hutchinson

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.

  1. arrêt mysqld
  2. 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 |       |
+------------------+-------+
1
bitfishxyz

Pour MySQL version 8.0, vous pouvez faire ceci:

  1. mysql.server stop
  2. mysql.server start --secure-file-priv = ''

Cela a fonctionné pour moi sur Mac High Sierra

0
Ruslan Krupenko