Come dovrei affrontare --secure-file-priv in MySQL?


358

Sto imparando MySQL e ho provato a usare una LOAD DATAclausola. Quando l'ho usato come di seguito:

LOAD DATA INFILE "text.txt" INTO table mytable;

Ho ricevuto il seguente errore:

Il server MySQL è in esecuzione con l'opzione --secure-file-priv, quindi non può eseguire questa istruzione

Come posso affrontare questo errore?

Ho verificato un'altra domanda sullo stesso messaggio di errore , ma non riesco ancora a trovare una soluzione.

Sto usando MySQL 5.6


condividi il percorso del tuo file csv
Zafar Malik,

1
Ovviamente, si ottiene questo errore quando si tenta di utilizzare mysqldump --tab, come se non fosse abbastanza difficile ottenere i propri dati da mysql.
William Entriken,

1
oltre alla risposta di vhu, cerca di seguito la risposta di wolfsshield. devi passare a '/' per farlo funzionare (sto usando win10)
Rsc Rsc

4
usa LOCAL. LOAD DATA LOCAL INFILE ...
mpoletto,

Risposte:


474

Funziona come previsto. Il tuo server MySQL è stato avviato con l' opzione --secure-file-priv che limita sostanzialmente da quali directory puoi caricare i file LOAD DATA INFILE.

È possibile utilizzare SHOW VARIABLES LIKE "secure_file_priv";per visualizzare la directory che è stata configurata.

Hai due opzioni:

  1. Sposta il tuo file nella directory specificata da secure-file-priv.
  2. Disabilita secure-file-priv. Questo deve essere rimosso dall'avvio e non può essere modificato in modo dinamico. Per fare ciò, controlla i parametri di avvio di MySQL (a seconda della piattaforma) e my.ini.

4
Per impostazione predefinita my.ini può essere trovato da "C: \ ProgramData \ MySQL \ MySQL Server 5.6" quando si esegue MySQL 5.6 sul server W2012. Potresti anche voler controllare i parametri di avvio del servizio (ad es. --Defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini) in quanto possono anche elencare --secure-file-privse stesso.
vhu

2
@Mohitbhasi, my-default.ini dovrebbe trovarsi nella cartella "C: \ Programmi \ MySQL \ MySQL Server 5.6". La posizione a cui si riferiva vhu è "C: \ ProgramData \ MySQL \ MySQL Server 5.6". Nel caso non l'avessi notato.
NurShomik,

67
Valore: NULL. FML.
William Entriken,

11
Si noti che se si utilizza "select .. into outfile" è necessario specificare il percorso completo e il percorso completo deve corrispondere ai risultati diSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight

9
"controlla i parametri" e "controlla my.ini" non è un'ottima risposta
Roland Seuhs

234

Ho avuto lo stesso problema. Alla fine ho risolto usando l' LOCALopzione nel comando

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

Puoi trovare maggiori informazioni qui http://dev.mysql.com/doc/refman/5.7/en/load-data.html

Se viene specificato LOCAL, il file viene letto dal programma client sull'host client e inviato al server. Il file può essere assegnato come nome percorso completo per specificare la posizione esatta. Se indicato come nome di percorso relativo, il nome viene interpretato in relazione alla directory in cui è stato avviato il programma client.


2
Questo ha funzionato per me e nessun altro. Ho provato: 1. caricare il mio file txt in C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. invalidante secure_file_privin my.inie il riavvio mysql 3. Questo uno! Grazie :)
Kamal Nayan,

10
Ho ricevuto questo messaggio di errore per MariaDB: "ERRORE 1148 (42000): il comando utilizzato non è consentito con questa versione di MariaDB". La versione esatta: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, per Linux (x86_64) utilizzando readline 5.2"
jciloa,

11
Ho ottenuto "Il comando utilizzato non è consentito con questa versione di MySQL" per MySQL versione 5.7.19.
Alison S,

2
@AlisonS Prova ad aggiungere il --local-infileflag durante l'esecuzione mysql. stackoverflow.com/questions/10762239/…
Illya Moskvin

1
The used command is not allowed with this MySQL versionda MySQL 8.0
bitfishxyz

118

Su Ubuntu 14 e Mysql 5.5.53 questa impostazione sembra essere abilitata per impostazione predefinita. Per disabilitarlo devi aggiungere il secure-file-priv = ""tuo file my.cnf nel gruppo di configurazione mysqld. per esempio:-

[mysqld]
secure-file-priv = ""

1
Questo ha funzionato anche per me. Stessa versione di Ubuntu e MySQL
Rodney,

1
+1 Ha funzionato per me. Se stai usando Ubuntu, non dimenticare di riavviare il servizio mysql: servizio sudo mysql restart
Emiliano Sangoi,

1
Questo è ciò che funziona se necessario per puntare a una posizione selezionata per istruzione, ove applicabile. Funziona con MySQL 5.7 su Windows Server proprio come hai spiegato. Se si commenta semplicemente la riga come # secure-file-priv = ~allora ha ancora l'errore poiché il valore mostra che NULLfarlo in questo modo risolve il problema quando si desidera selezionare in quali directory è possibile esportare sul server, ecc.
Bitcoin Murderous Maniac

1
Ha funzionato per me con MySQL 5.7 su Windows, mentre le altre soluzioni no.
CGritton,

NB: se lo si fa in Docker è necessario riavviare il contenitore Docker.
user1717828,

38

Sto lavorando su MySQL5.7.11 su Debian, il comando che ha funzionato per me per vedere la directory è:

mysql> SELECT @@global.secure_file_priv;

Con SHOW VARIABLES LIKE "secure_file_priv";ottengo ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existche viene lanciato anche in altre circostanze e dovrò eventualmente affrontare. Il SELECT @@global.secure_file_priv;comando però ha prodotto il risultato atteso.
Majid Fouladpour,

1
Questo ha funzionato per me - Ubuntu Mysql 5.7.21: ha cambiato il file di output nella directory /var/lib/mysql-files/output.txt
Shanemeister,

2
Come lo modifichi allora? Ho provato a modificarlo in /etc/mysql/my.cnf e sembra non avere alcun effetto - rimane NULL
Slavik

25

Ecco cosa ha funzionato per me in Windows 7 per disabilitare secure-file-priv(Opzione 2 dalla risposta di Vhu ):

  1. Arresta il servizio server MySQL accedendo services.msc.
  2. Vai a C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDataera una cartella nascosta nel mio caso).
  3. Apri il my.inifile in Blocco note.
  4. Cerca 'secure-file-priv'.
  5. Commenta la riga aggiungendo '#' all'inizio della riga. Per MySQL Server 5.7.16 e versioni successive, i commenti non funzioneranno. Devi impostarlo su una stringa vuota come questa -secure-file-priv=""
  6. Salva il file.
  7. Avviare il servizio server MySQL accedendo a services.msc.

16
A partire da MySQL Server 5.7.16, commentare la riga non funzionerà, perché tornerà al valore predefinito, che disabilita le operazioni di importazione ed esportazione. Ora è necessario impostarlo su una stringa vuota se si desidera consentire queste operazioni da qualsiasi directory.
dbc,

1
Ramnath, per favore, modifica la tua risposta con i dettagli di @dbc per la versione 5.7.x. Grazie.
Rafael Gomes Francisco,

Aggiungere una stringa vuota funziona per me; per favore cambia la risposta per aggiungere una stringa vuota come secure-file-priv = ""
Rajesh Goel,

Per Windows assicurati di utilizzare le barre
Oliver Oliver

22

Se il file è locale sul tuo computer, utilizza LOCAL nel tuo comando

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

15

@vhu

L'ho fatto SHOW VARIABLES LIKE "secure_file_priv";ed è tornato, C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\quindi quando l'ho collegato, non ha ancora funzionato.

Quando sono andato direttamente al file my.ini ho scoperto che il percorso è formattato in modo leggermente diverso: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Quindi quando l'ho eseguito con quello, ha funzionato. L'unica differenza è la direzione delle barre.


la tua risposta ha funzionato per me, grazie mille
benaou mouad,

Sì sì sì ... perché questa risposta è così in basso. ho lottato a lungo e poi l'ho preso. sono tornato per aggiungere questo come risposta, ma è così in fondo che non l'ho visto prima di aver perso tempo.
Rsc Rsc,

Non tutti gli eroi indossano mantelli.
JRK,

9

Ho avuto lo stesso problema con "secure-file-priv". I commenti nel file .ini non hanno funzionato, né lo spostamento del file nella directory specificata da 'secure-file-priv'.

Infine, come suggerito da dbc, ha funzionato "secure-file-priv" come una stringa vuota. Quindi, se qualcuno è bloccato dopo aver provato le risposte sopra, si spera che ciò aiuti.


9

La cosa che ha funzionato per me:

  1. Inserisci il tuo file all'interno della cartella specificata in secure-file-priv.

Per trovare quel tipo:

mysql> mostra variabili come "secure_file_priv";


  1. Controlla se hai local_infile = 1.

Fai quello digitando:

mysql> mostra variabili come "local_infile";

Se ottieni:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

Quindi impostalo su una sola digitazione:

mysql> set global local_infile = 1;


  1. Specifica il percorso completo per il tuo file. Nel mio caso:

mysql> carica i dati "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" nel test della tabella;


6

Questa discussione è stata letta 522k volte al momento di questo post. Onestamente, quando MySQL è diventata la nostra mamma irragionevole protettiva ? Che tentativo di sicurezza che richiede tempo - che in realtà serve solo a incatenarci!

Dopo molte ricerche e molti tentativi, tutto è fallito.
La mia soluzione:

  1. Importa il file .csv tramite l'importazione PhpMyAdmin su una casella precedente (se grande fai alla riga cmd)
  2. genera un file .sql
  3. scarica il file .sql
  4. importare file .sql tramite banco di lavoro MySQL

4

Ho creato uno script di importazione NodeJS se stai eseguendo nodeJS e i tuoi dati sono nel seguente formato (virgoletta doppia + virgola e \ n nuova riga)

INSERT INTO <your_table> VALUEs( **CSV LINE **)

Questo è configurato per funzionare su http: // localhost: 5000 / import .

Vado riga per riga e crea una stringa di query

"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...

server.js

const express = require('express'),
   cors = require('cors'),
   bodyParser = require('body-parser'),
   cookieParser = require('cookie-parser'),
   session = require('express-session'),
   app = express(),
   port = process.env.PORT || 5000,
   pj = require('./config/config.json'),
   path = require('path');

app.use(bodyParser.json());
app.use(cookieParser());
app.use(cors());


app.use(
   bodyParser.urlencoded({
      extended: false,
   })
);

var Import = require('./routes/ImportRoutes.js');

app.use('/import', Import);
if (process.env.NODE_ENV === 'production') {
   // set static folder
   app.use(express.static('client/build'));

   app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
   });
}

app.listen(port, function () {
   console.log('Server is running on port: ' + port);
});

ImportRoutes.js

const express = require('express'),
   cors = require('cors'),
   fs = require('fs-extra'),
   byline = require('byline'),
   db = require('../database/db'),
   importcsv = express.Router();

importcsv.use(cors());

importcsv.get('/csv', (req, res) => {

   function processFile() {
      return new Promise((resolve) => {
         let first = true;
         var sql, sqls;
         var stream = byline(
            fs.createReadStream('../PATH/TO/YOUR!!!csv', {
               encoding: 'utf8',
            })
         );

         stream
            .on('data', function (line, err) {
               if (line !== undefined) {
                  sql = 'INSERT INTO <your_table> VALUES (' + line.toString() + ');';
                  if (first) console.log(sql);
                  first = false;
                  db.sequelize.query(sql);
               }
            })
            .on('finish', () => {
               resolve(sqls);
            });
      });
   }

   async function startStream() {
      console.log('started stream');
      const sqls = await processFile();
      res.end();
      console.log('ALL DONE');
   }

   startStream();
});

module.exports = importcsv;

db.js è il file di configurazione

const Sequelize = require('sequelize');
const db = {};
const sequelize = new Sequelize(
   config.global.db,
   config.global.user,
   config.global.password,
   {
      host: config.global.host,
      dialect: 'mysql',
      logging: console.log,
      freezeTableName: true,

      pool: {
         max: 5,
         min: 0,
         acquire: 30000,
         idle: 10000,
      },
   }
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Dichiarazione di non responsabilità: questa non è una soluzione perfetta - la sto pubblicando solo per gli sviluppatori che sono in una sequenza temporale e hanno molti dati da importare e stanno riscontrando questo ridicolo problema. Ho perso molto tempo su questo e spero di risparmiare un altro sviluppatore allo stesso tempo perso.


3

Ho avuto ogni sorta di problemi con questo. Stavo cambiando my.cnf e ogni sorta di cose folli che altre versioni di questo problema hanno provato a mostrare.

Cosa ha funzionato per me:

L'errore che stavo ottenendo

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Sono stato in grado di risolverlo aprendo /usr/local/mysql/support-files/mysql.server e modificando la seguente riga:

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

per

$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

Se stai eseguendo Ubuntu, potresti anche aver bisogno di configurare Apparmor per consentire a MySQL di scrivere nella tua cartella, ad esempio ecco la mia configurazione:

Aggiungi questa riga al file /etc/apparmor.d/usr.sbin.mysqld:

/var/lib/mysql-files/* rw

Quindi aggiungi queste 2 righe di configurazione alle sezioni /etc/mysql/my.cnf:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Ecco il mio SQL:

select id from blahs into outfile '/var/lib/mysql-files/blahs';

Ha funzionato per me. In bocca al lupo!


Sì, inserendo il percorso del file con "/var/lib/mysql-files/filename.csv" ha funzionato per me.
Anidhya Bhatnagar,

3

Per la versione di mysql 8.0 puoi fare questo:

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

Ha funzionato per me su Mac High Sierra


1

Ho avuto questo problema su Windows 10. "--secure-file-priv in MySQL" Per risolvere questo ho fatto il seguente.

  1. Nella ricerca di windows (in basso a sinistra) ho digitato "powershell".
  2. Fare clic con il tasto destro su PowerShell ed eseguito come amministratore.
  3. Passato al file bin del server. (C: \ Programmi \ MySQL \ MySQL Server 5.6 \ bin);
  4. Digitato ./mysqld
  5. Premi "invio"

Il server è stato avviato come previsto.


1

MySQL utilizza questa variabile di sistema per controllare dove è possibile importare i file

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+

Quindi il problema è come modificare variabili di sistema come secure_file_priv.

  1. spegnimento mysqld
  2. sudo mysqld_safe --secure_file_priv=""

ora potresti vedere in questo modo:

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+

0

In macOS Catalina, ho seguito questi passaggi per impostare secure_file_priv

1. Arrestare il servizio MySQL

 sudo /usr/local/mysql/support-files/mysql.server stop

2. Riavviare MYSQL assegnando le variabili di sistema --secure_file_priv

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY

Nota: l'aggiunta di un valore vuoto risolve il problema e MYSQL esporterà i dati nella directory / usr / local / mysql / data / YOUR_DB_TABLE / EXPORT_FILE

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=

Grazie


0

Senza modificare nessuno dei file di configurazione.

  1. cerca il valore di secure_file_privusare il comando pubblicato da @vhu:SHOW VARIABLES LIKE "secure_file_priv" .
  2. definire il percorso completo per la query come: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

questo ha funzionato per il mio in mysql-shell su Ubuntu 18.04 LTS mysql 5.7.29

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.