Hoe moet ik –secure-file-priv in MySQL aanpakken?

Ik ben MySQL aan het leren en heb geprobeerd een LOAD DATA-clausule te gebruiken. Toen ik het gebruikte zoals hieronder:

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

Ik krijg de volgende foutmelding:

De MySQL-server draait met de optie –secure-file-priv, dus deze instructie kan niet worden uitgevoerd

Hoe los ik deze fout op?

Ik heb nog een vraag over dezelfde foutmelding, maar kan nog steeds geen oplossing vinden.

Ik gebruik MySQL 5.6


Antwoord 1, autoriteit 100%

Het werkt zoals bedoeld. Uw MySQL-server is gestart met — secure-file-privoptie die in feite beperkt uit welke mappen u bestanden kunt laden met behulp van LOAD DATA INFILE.

U kunt SHOW VARIABLES LIKE "secure_file_priv";gebruiken om de map te zien die is geconfigureerd.

Je hebt twee opties:

  1. Verplaats je bestand naar de map gespecificeerd door secure-file-priv.
  2. Schakel secure-file-privuit. Dit moet bij het opstarten worden verwijderd en kan niet dynamisch worden gewijzigd. Controleer hiervoor uw MySQL-opstartparameters (afhankelijk van platform) en my.ini.

Antwoord 2, autoriteit 49%

Ik heb het opgelost met de optie LOCALin het commando:

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

U kunt meer info hier vinden.

Als lokaal is opgegeven, wordt het bestand gelezen door het clientprogramma op de
Klanthost en verzonden naar de server. Het bestand kan als vol worden gegeven
Padnaam om de exacte locatie te specificeren. Indien gegeven als een relatief pad
Naam, de naam wordt geïnterpreteerd ten opzichte van de map waarin de
Clientprogramma is gestart.


3, Autoriteit 24%

Op Ubuntu 14 en MySQL 5.5.53 Deze instelling lijkt standaard in staat te zijn. Om het uit te schakelen, moet u secure-file-priv = ""toevoegen aan uw My.cnf-bestand onder de MySQLD Config-groep. bijv.: –

[mysqld]
secure-file-priv = ""

4, Autoriteit 8%

Ik werk aan MySQL5.7.11 op Debian, het commando dat voor mij werkte om de map te zien is:

mysql> SELECT @@global.secure_file_priv;

Antwoord 5, autoriteit 5%

@vhu Ik deed de SHOW VARIABLES LIKE "secure_file_priv";en het gaf C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\terug, dus toen ik dat stopte in, het werkte nog steeds niet.

Toen ik rechtstreeks naar het bestand my.iniging, ontdekte ik dat het pad een beetje anders is opgemaakt:

C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Toen ik het daarmee uitvoerde, werkte het. Het enige verschil was de richting van de schuine strepen.


Antwoord 6, autoriteit 5%

Als het bestand lokaal op uw computer staat, gebruik dan de LOCALin uw opdracht

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

Antwoord 7, autoriteit 3%

Deze thread is 570k keer bekeken op het moment van dit bericht. Eerlijk gezegd, wanneer is MySQL onze overbeschermende, onredelijke moeder geworden? Wat een tijdrovende poging tot beveiliging – die eigenlijk alleen maar dient om ons te boeien!

Na veel zoeken en veel pogingen mislukte alles.
Mijn oplossing:

Wat voor mij werkte was:

  1. Importeer het .csv-bestand via PhpMyAdmin import op oudere box (indien groot, doe dit op cmd-regel)
  2. Genereer een .sql-bestand.
  3. Download .sql-bestand.
  4. Importeer .sql-bestand via MySQL Workbench.

Antwoord 8, autoriteit 2%

Wat voor mij werkte:

  1. Plaats uw bestand in de map die is opgegeven in secure-file-priv.

    Om dat type te vinden:

    mysql> show variables like "secure_file_priv";  
    
  2. Controleer of u local_infile = 1hebt.

    Doe dat typen:

    mysql> show variables like "local_infile";
    

    Als u krijgt:

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

    Stel het vervolgens in op één typen:

    mysql> set global local_infile = 1;
    
  3. Geef het volledige pad op voor uw bestand. In mijn geval:

    mysql> load data infile "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/file.txt" into table test;
    

9, Autoriteit 2%

Ik had hetzelfde probleem met ‘Secure-File-PRIV’. Commentaar in het .ini-bestand werkte niet en heeft geen bestand in de directory opgegeven door ‘Secure-File-PRIV’.

Ten slotte, zoals DBC stelde, het maken van ‘Secure-File-PRIV’ gelijk aan een lege reeks. Dus als iemand vasthoudt na het proberen van antwoorden hierboven, zal u dit doen, dit zal helpen.


10

Voor MySQL 8.0-versie kunt u dit doen:

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

het werkte voor mij op Mac High Sierra.


11

Als u op Ubuntu gebruikt, moet u mogelijk Apparmor ook configureren om MySQL toe te staan ​​om naar uw map te schrijven, b.v. Hier is mijn configuratie:

Voeg deze regel toe aan bestand /etc/apparmor.d/USR.SBIN.MYSQLD:

/var/lib/mysql-files/* rw

Voeg dan deze 2 configuratieregels toe aan /etc/mysql/my.cnf secties:

[client]
loose-local-infile = 1
[mysqld]
secure-file-priv = ""

Hier is mijn SQL:

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

Het werkte voor mij. Veel succes!


Antwoord 12

Ik heb een NodeJS-importscript gemaakt als je nodeJS gebruikt en je gegevens de volgende vorm hebben (dubbele aanhalingstekens + komma en \n nieuwe regel)

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

Deze is geconfigureerd om te draaien op http://localhost:5000/import.

Ik ga regel voor regelen maak een zoekreeks aan

"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 is het configuratiebestand

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;

Disclaimer:dit is geen perfecte oplossing – ik plaats het alleen voor ontwikkelaars die zich onder een tijdlijn bevinden en veel gegevens hebben om te importeren en die dit belachelijke probleem tegenkomen. Ik heb hier veel tijd aan verloren en ik hoop een andere ontwikkelaar dezelfde verloren tijd te besparen.


Antwoord 13

Ik had hier allerlei problemen mee. Ik was mijn.cnf aan het veranderen en allerlei gekke dingen die andere versies van dit probleem probeerden te laten zien.

Wat voor mij werkte:

De fout die ik kreeg

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

Ik heb het kunnen repareren door /usr/local/mysql/support-files/mysql.server te openen en de volgende regel te wijzigen:

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

naar

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

Antwoord 14

Bij macOS Catalina heb ik deze stappen gevolgd om secure_file_priv

in te stellen

1.Stop MySQL-service

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

2. Restart MySQL toewijzing –Secure_file_Priv-systeemvariabelen

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

OPMERKING: De lege waarde toevoegen Fixeer het probleem voor mij en MySQL zal gegevens exporteren naar Directory / USR / LOCAL / MYSQL / DATA / YEA_DB_TABLE / EXPORT_FILE

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

bedankt


15

Dit werkte voor mij (had het aanvullende probleem om niet in staat te zijn om lokaal te gebruiken met mijn huidige MySQL-versie in de Verklaring Laaddatum Infile …)

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

Het bovenstaande werkt voor dat gegeven pad op mijn machine; Mogelijk moet u uw pad aanpassen.

Gebruik dan:

mysql -u root -p

Een belangrijk punt is dat u de CSV in de map MySQL-gegevens moet hebben. In mijn machine bevindt het zich op: /USR/LOCAL/MYSQL-8.0.18-MACOS10.14-X86_64/DATA

U kunt de mapvergunning wijzigen indien nodig om een ​​CSV in de map van de gegevens te laten vallen.

Setup:
MacOS Catalina versie 10.15.5
MySQL-versie 8.0.18


16

MySQL Gebruik dit systeemvariabele om te bepalen waar u u bestanden kunt importeren

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

Het probleem is dus hoe je systeemvariabelen zoals secure_file_privkunt wijzigen.

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

nu ziet u er misschien zo uit:

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

Antwoord 17

Ik had dit probleem in Windows 10. “–secure-file-priv in MySQL” Om dit op te lossen heb ik het volgende gedaan.

  1. In Windows Search (linksonder) typte ik “powershell”.
  2. Klik met de rechtermuisknop op powershell en startte als admin.
  3. Naar het serverbin-bestand genavigeerd. (C:\Program Files\MySQL\MySQL Server 5.6\bin);
  4. Getypt ./mysqld
  5. Druk op “enter”

De server is opgestart zoals verwacht.


Antwoord 18

Zonder de configuratiebestanden te wijzigen..

  1. zoek de waarde van secure_file_privmet behulp van de opdracht van @vhu: SHOW VARIABLES LIKE "secure_file_priv".
  2. definieer het volledige pad voor uw zoekopdracht, zoals: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

dit werkte voor mijn in mysql-shell op ubuntu 18.04 LTS mysql 5.7.29


Antwoord 19

in Linuxmoet je het my.cnf-bestand bewerken in

/etc/mysql/my.cnf

en verander 26 line numberparam als volgt:

secure-file-priv= <your data path directory like /home/user/data>

Start vervolgens uw MySQL opnieuw op en probeer het opnieuw.

In Docker
U moet uw MY.CNF-bestand monteren met My.CNF-bestand in uw container met deze opdracht in Docker-Compose of handmatig toevoegen:

volumes:
  - ./persistent:/var/lib/mysql
  - ./conf/my.cnf:/etc/mysql/my.cnf

Volgende wijziging /conf/my.cnf in uw host en configuratie Secure-File-Priv Param zoals de UPPER-aanpak, bovendien moet u uw gegevens in MySQL-container monteren en dat pad instellen Voor Secure-File-Priv Param en start uw services opnieuw op en ten slotte kunt u uw gegevens laden.

U kunt uw configuratie controleren met deze opdracht:

SHOW VARIABLES LIKE "secure_file_priv";

20

Ik heb de LOCALaan de opdracht toegevoegd, maar het heeft een ander probleem gemaakt:

Loading local data is disabled - this must be enabled on both the client and server sides

Voor het oplossen van dit ik volgde eenvoudig drie stappen in hier

Other episodes