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:
- Verplaats je bestand naar de map gespecificeerd door
secure-file-priv
. - Schakel
secure-file-priv
uit. 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 LOCAL
in 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.ini
ging, 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:
- Importeer het
.csv
-bestand via PhpMyAdmin import op oudere box (indien groot, doe dit op cmd-regel) - Genereer een
.sql
-bestand. - Download
.sql
-bestand. - Importeer
.sql
-bestand via MySQL Workbench.
Antwoord 8, autoriteit 2%
Wat voor mij werkte:
-
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";
-
Controleer of u
local_infile = 1
hebt.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;
-
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_priv
kunt wijzigen.
- afsluiten
mysqld
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.
- In Windows Search (linksonder) typte ik “powershell”.
- Klik met de rechtermuisknop op powershell en startte als admin.
- Naar het serverbin-bestand genavigeerd. (C:\Program Files\MySQL\MySQL Server 5.6\bin);
- Getypt ./mysqld
- Druk op “enter”
De server is opgestart zoals verwacht.
Antwoord 18
Zonder de configuratiebestanden te wijzigen..
- zoek de waarde van
secure_file_priv
met behulp van de opdracht van @vhu:SHOW VARIABLES LIKE "secure_file_priv"
. - 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 number
param 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 LOCAL
aan 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