Wie soll ich --secure-file-priv in MySQL angehen?

357

Ich lerne MySQL und habe versucht, eine LOAD DATAKlausel zu verwenden. Als ich es wie folgt benutzte:

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

Ich habe folgenden Fehler erhalten:

Der MySQL-Server wird mit der Option --secure-file-priv ausgeführt, sodass diese Anweisung nicht ausgeführt werden kann

Wie gehe ich diesen Fehler an?

Ich habe eine andere Frage in derselben Fehlermeldung überprüft , kann aber immer noch keine Lösung finden.

Ich benutze MySQL 5.6

Mohit Bhasi
quelle
Teilen Sie den Pfad Ihrer CSV-Datei
Zafar Malik
1
Natürlich erhalten Sie diesen Fehler, wenn Sie versuchen, ihn zu verwenden mysqldump --tab, als ob es nicht schwierig genug wäre, Ihre eigenen Daten aus MySQL herauszuholen.
William Entriken
1
Suchen Sie unten nach der Antwort von vhu nach der Antwort von wolfsshield. Sie müssen zu '/' wechseln, damit es funktioniert (ich verwende win10)
Rsc Rsc
4
benutze LOCAL. LOAD DATA LOCAL INFILE ...
mpoletto

Antworten:

473

Es funktioniert wie beabsichtigt. Ihr MySQL-Server wurde mit der Option --secure-file-priv gestartet, die im Grunde begrenzt, aus welchen Verzeichnissen Sie Dateien laden können LOAD DATA INFILE.

Sie können verwenden SHOW VARIABLES LIKE "secure_file_priv";, um das konfigurierte Verzeichnis anzuzeigen.

Sie haben zwei Möglichkeiten:

  1. Verschieben Sie Ihre Datei in das von angegebene Feld secure-file-priv.
  2. Deaktivieren secure-file-priv. Dies muss vom Start entfernt werden und kann nicht dynamisch geändert werden. Überprüfen Sie dazu Ihre MySQL-Startparameter (je nach Plattform) und my.ini.
vhu
quelle
4
Standardmäßig kann my.ini unter "C: \ ProgramData \ MySQL \ MySQL Server 5.6" gefunden werden, wenn MySQL 5.6 auf dem W2012-Server ausgeführt wird. Möglicherweise möchten Sie auch die Startparameter des Dienstes überprüfen (z. B. --defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini), da sie sich möglicherweise auch --secure-file-privselbst
auflisten
2
@Mohitbhasi, my-default.ini sollte sich im Ordner "C: \ Programme \ MySQL \ MySQL Server 5.6" befinden. Der Speicherort, auf den sich vhu bezog, ist "C: \ ProgramData \ MySQL \ MySQL Server 5.6". Nur für den Fall, dass Sie es nicht bemerkt haben.
NurShomik
67
Wert: NULL. FML.
William Entriken
11
Beachten Sie, dass Sie bei Verwendung von "select .. into outfile" den vollständigen Pfad angeben müssen und der vollständige Pfad mit den Ergebnissen vonSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight
9
"check the parameters" und "check my.ini" ist keine sehr gute Antwort
Roland Seuhs
234

Ich hatte das gleiche Problem. Ich habe es endlich mit der LOCALOption im Befehl gelöst

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

Weitere Informationen finden Sie hier http://dev.mysql.com/doc/refman/5.7/en/load-data.html

Wenn LOCAL angegeben ist, wird die Datei vom Client-Programm auf dem Client-Host gelesen und an den Server gesendet. Die Datei kann als vollständiger Pfadname angegeben werden, um den genauen Speicherort anzugeben. Wenn als relativer Pfadname angegeben, wird der Name relativ zu dem Verzeichnis interpretiert, in dem das Client-Programm gestartet wurde.

Staza
quelle
2
Das hat bei mir und keinem anderen funktioniert. Ich habe versucht: 1. meiner txt - Datei in laden C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. Deaktivieren secure_file_privin my.iniund Neustarten mysql 3. Dieser! Danke :)
Kamal Nayan
10
Ich habe folgende Fehlermeldung für MariaDB erhalten: "FEHLER 1148 (42000): Der verwendete Befehl ist in dieser MariaDB-Version nicht zulässig." Die genaue Version: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, für Linux (x86_64) mit readline 5.2"
jciloa
11
Ich habe "Der verwendete Befehl ist mit dieser MySQL-Version nicht erlaubt" für MySQL-Version 5.7.19 erhalten.
Alison S
2
@AlisonS Versuchen Sie, das --local-infileFlag beim Ausführen hinzuzufügen mysql. stackoverflow.com/questions/10762239/…
Illya Moskvin
1
The used command is not allowed with this MySQL versionvon MySQL 8.0
bitfishxyz
117

Unter Ubuntu 14 und MySQL 5.5.53 scheint diese Einstellung standardmäßig aktiviert zu sein. Um es zu deaktivieren, müssen Sie es secure-file-priv = ""unter der Konfigurationsgruppe mysqld zu Ihrer Datei my.cnf hinzufügen . z.B:-

[mysqld]
secure-file-priv = ""
Mustafa
quelle
1
Das hat auch bei mir funktioniert. Gleiche Version von Ubuntu und MySQL
Rodney
1
+1 Hat für mich gearbeitet. Wenn Sie Ubuntu verwenden, vergessen Sie nicht, den MySQL-Dienst neu zu starten: Sudo-Dienst MySQL-Neustart
Emiliano Sangoi
1
Dies funktioniert, wenn Sie auf einen Ort verweisen müssen, den Sie gegebenenfalls pro Anweisung auswählen. Dies funktioniert mit MySQL 5.7 unter Windows Server genau so, wie Sie es erklärt haben. Wenn Sie die Zeile einfach wie folgt auskommentieren # secure-file-priv = ~, tritt immer noch der Fehler auf, da der Wert auf NULLdiese Weise angezeigt wird. Dadurch wird das Problem behoben, wenn Sie auswählen möchten, in welche Verzeichnisse Sie auf dem Server exportieren können usw.
Bitcoin Murderous Maniac
1
Arbeitete für mich mit MySQL 5.7 unter Windows, während die anderen Lösungen dies nicht taten.
CGritton
Hinweis: Wenn Sie dies in Docker tun, müssen Sie den Docker-Container neu starten.
user1717828
38

Ich arbeite an MySQL5.7.11 unter Debian. Der Befehl, mit dem ich das Verzeichnis sehen konnte, lautet:

mysql> SELECT @@global.secure_file_priv;
Carlos Med
quelle
Mit SHOW VARIABLES LIKE "secure_file_priv";bekomme ich ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existwas auch unter anderen Umständen geworfen wird und ich werde mich irgendwann darum kümmern müssen. Der SELECT @@global.secure_file_priv;Befehl ergab jedoch das erwartete Ergebnis.
Majid Fouladpour
1
Dies funktionierte für mich - Ubuntu Mysql 5.7.21: änderte die Ausgabedatei in Verzeichnis /var/lib/mysql-files/output.txt
Shanemeister
2
Wie bearbeitest du es dann? Ich habe versucht, es in /etc/mysql/my.cnf zu bearbeiten und es scheint keine Wirkung zu haben - es bleibt NULL
Slavik
24

Folgendes hat in Windows 7 funktioniert, um es zu deaktivieren secure-file-priv(Option 2 aus der Antwort von vhu ):

  1. Beenden Sie den MySQL-Serverdienst, indem Sie in gehen services.msc.
  2. Gehe zu C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDatawar in meinem Fall ein versteckter Ordner).
  3. Öffnen Sie die my.iniDatei im Editor.
  4. Suchen Sie nach 'Secure-File-Priv'.
  5. Kommentieren Sie die Zeile aus, indem Sie am Anfang der Zeile '#' hinzufügen. Für MySQL Server 5.7.16 und höher funktioniert das Kommentieren nicht. Sie müssen es auf eine leere Zeichenfolge wie diese setzen -secure-file-priv=""
  6. Speicher die Datei.
  7. Starten Sie den MySQL-Serverdienst, indem Sie in gehen services.msc.
Janaaaa
quelle
16
Ab MySQL Server 5.7.16 funktioniert das Auskommentieren der Zeile nicht mehr, da dann die Standardeinstellung wiederhergestellt wird, wodurch Import- und Exportvorgänge deaktiviert werden. Sie müssen es jetzt auf eine leere Zeichenfolge setzen, wenn Sie diese Vorgänge aus einem beliebigen Verzeichnis zulassen möchten.
dbc
1
Ramnath, bitte bearbeiten Sie Ihre Antwort mit @dbc Detail für die Version 5.7.x. Vielen Dank.
Rafael Gomes Francisco
Das Hinzufügen einer leeren Zeichenfolge funktioniert bei mir. Bitte ändern Sie die Antwort, um eine leere Zeichenfolge wie Secure-File-Priv = ""
Rajesh Goel
Für Windows stellen Sie sicher, Schrägstriche zu verwenden
Oliver Oliver
22

Wenn die Datei lokal auf Ihrem Computer ist, verwenden Sie LOCAL in Ihrem Befehl

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

@vhu

Ich tat das SHOW VARIABLES LIKE "secure_file_priv";und es kehrte zurückC:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ Als ich das einsteckte, funktionierte es immer noch nicht.

Als ich direkt zur Datei my.ini ging, stellte ich fest, dass der Pfad etwas anders formatiert ist: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Dann, als ich es damit lief, funktionierte es. Der einzige Unterschied ist die Richtung der Schrägstriche.

Wolfsschild
quelle
Ihre Antwort hat für mich funktioniert, vielen
Dank
Ja ja ja ... warum ist diese Antwort so weit unten. Ich kämpfte lange und bekam es dann. Ich bin zurückgekommen, um dies als Antwort hinzuzufügen, aber es ist so weit unten, dass ich es nicht gesehen habe, bevor ich meine Zeit verschwendet habe.
Rsc Rsc
Nicht alle Helden tragen Umhänge.
JRK
8

Ich hatte das gleiche Problem mit 'Secure-File-Priv'. Das Kommentieren in der INI-Datei funktionierte nicht und das Verschieben der Datei in das durch 'Secure-File-Priv' angegebene Verzeichnis auch nicht.

Schließlich funktionierte es, wie von dbc vorgeschlagen, 'Secure-File-Priv' gleich einer leeren Zeichenfolge zu machen. Wenn also jemand feststeckt, nachdem er die obigen Antworten ausprobiert hat, hilft dies hoffentlich.

Rsc Rsc
quelle
8

Das, was bei mir funktioniert hat:

  1. Legen Sie Ihre Datei in den in angegebenen Ordner secure-file-priv.

So finden Sie diesen Typ:

mysql> zeige Variablen wie "secure_file_priv";


  1. Überprüfen Sie, ob Sie haben local_infile = 1.

Mach das tippen:

mysql> zeige Variablen wie "local_infile";

Wenn du bekommst:

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

Stellen Sie dann eine Eingabe ein:

mysql> set global local_infile = 1;


  1. Geben Sie den vollständigen Pfad für Ihre Datei an. In meinem Fall:

mysql> Dateninfile "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" in Tabellentest laden;

Vinícius Souza
quelle
6

Dieser Thread wurde zum Zeitpunkt dieses Beitrags 522.000 Mal angesehen . Ehrlich gesagt, wann wurde MySQL unsere übermäßig schützende, unvernünftige Mutter ? Was für ein zeitaufwändiger Sicherheitsversuch - der uns wirklich nur fesselt!

Nach vielen Suchen und vielen Versuchen schlug alles fehl.
Meine Lösung:

  1. Importieren Sie die CSV-Datei über den PhpMyAdmin-Import in eine ältere Box (wenn groß, in cmd-Zeile)
  2. Generieren Sie eine SQL-Datei
  3. .sql-Datei herunterladen
  4. Importieren Sie eine SQL-Datei über die MySQL-Werkbank
Nelles
quelle
3

Ich hatte alle möglichen Probleme damit. Ich habe my.cnf und alle möglichen verrückten Dinge geändert, die andere Versionen dieses Problems zu zeigen versuchten.

Was hat bei mir funktioniert:

Der Fehler, den ich bekam

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

Ich konnte das Problem beheben, indem ich /usr/local/mysql/support-files/mysql.server öffnete und die folgende Zeile änderte:

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

zu

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

Wenn Sie unter Ubuntu arbeiten, müssen Sie möglicherweise auch Apparmor konfigurieren, damit MySQL in Ihren Ordner schreiben kann. Beispiel: Hier ist meine Konfiguration:

Fügen Sie diese Zeile zur Datei /etc/apparmor.d/usr.sbin.mysqld hinzu:

/var/lib/mysql-files/* rw

Fügen Sie dann diese beiden Konfigurationszeilen zu den Abschnitten /etc/mysql/my.cnf hinzu:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Hier ist mein SQL:

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

Es hat bei mir funktioniert. Viel Glück!

Kevin Hutchinson
quelle
Ja, das Speichern des Outfile-Pfads mit "/var/lib/mysql-files/filename.csv" hat bei mir funktioniert.
Anidhya Bhatnagar
3

Für MySQL 8.0 können Sie dies tun:

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

Es hat bei mir auf Mac High Sierra funktioniert

Ruslan Krupenko
quelle
3

Ich habe ein NodeJS-Importskript erstellt, wenn Sie nodeJS ausführen und Ihre Daten in der folgenden Form vorliegen (doppeltes Anführungszeichen + Komma und \ n neue Zeile).

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

Dieser ist so konfiguriert, dass er unter http: // localhost: 5000 / import ausgeführt wird .

Ich gehe Zeile für Zeile und erstelle eine Abfragezeichenfolge

"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 ist die Konfigurationsdatei

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;

Haftungsausschluss: Dies ist keine perfekte Lösung. Ich veröffentliche sie nur für Entwickler, die sich unter einer Zeitachse befinden und viele Daten importieren müssen und auf dieses lächerliche Problem stoßen. Ich habe viel Zeit verloren und hoffe, einem anderen Entwickler die gleiche verlorene Zeit zu ersparen.

Nelles
quelle
1

Ich hatte dieses Problem unter Windows 10. "--secure-file-priv in MySQL" Um dies zu lösen, habe ich Folgendes getan.

  1. In der Windows-Suche (unten links) habe ich "Powershell" eingegeben.
  2. Rechtsklick auf Powershell und lief als Admin.
  3. Navigierte zur Server-Bin-Datei. (C: \ Programme \ MySQL \ MySQL Server 5.6 \ bin);
  4. Eingetragen ./mysqld
  5. Drücke Enter"

Der Server wurde wie erwartet gestartet.

Jason Allshorn
quelle
1

MySQL verwendet diese Systemvariable, um zu steuern, wo Sie Ihre Dateien importieren können

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

Das Problem ist also, wie man Systemvariablen wie ändert secure_file_priv.

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

Jetzt sehen Sie vielleicht so:

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

Bei macOS Catalina habe ich diese Schritte ausgeführt secure_file_priv

1. Beenden Sie den MySQL-Dienst

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

2. Starten Sie MYSQL neu, indem Sie die Systemvariablen --secure_file_priv zuweisen

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

Hinweis: Durch Hinzufügen eines leeren Werts wird das Problem für mich behoben, und MYSQL exportiert Daten in das Verzeichnis / usr / local / mysql / data / YOUR_DB_TABLE / EXPORT_FILE

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

Vielen Dank

Sushil Adhikari
quelle
0

Ohne die Konfigurationsdateien zu ändern.

  1. secure_file_privSuchen Sie nach dem Wert der Verwendung des von @vhu geposteten Befehls:SHOW VARIABLES LIKE "secure_file_priv" .
  2. Definieren Sie den vollständigen Pfad für Ihre Abfrage wie: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

Dies funktionierte für meine in MySQL-Shell auf Ubuntu 18.04 LTS MySQL 5.7.29

user2804070
quelle