MySQL में मुझे --सेक्योर-फाइल-प्राइवेट से कैसे निपटना चाहिए?


357

मैं MySQL सीख रहा हूँ और एक LOAD DATAखंड का उपयोग करने की कोशिश की । जब मैंने इसे नीचे दिया था:

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

मुझे निम्नलिखित त्रुटि मिली:

MySQL सर्वर --secure-file-Private विकल्प के साथ चल रहा है, इसलिए यह इस कथन को निष्पादित नहीं कर सकता है

मैं इस त्रुटि से कैसे निपटूं?

मैंने एक ही त्रुटि संदेश पर एक और प्रश्न की जाँच की है , लेकिन अभी भी एक समाधान नहीं मिल रहा है।

मैं MySQL 5.6 का उपयोग कर रहा हूं


अपनी सीएसवी फ़ाइल का हिस्सा साझा करें
ज़फ़र मलिक

1
बेशक, आपको यह त्रुटि तब आती है जब उपयोग करने की कोशिश की जाती है mysqldump --tab, जैसे कि यह इतना मुश्किल नहीं था कि आपका अपना डेटा mysql से बाहर निकले।
विलियम एंट्रिएन

1
वु के जवाब के अलावा, वुल्फशील्ड के जवाब के लिए नीचे खोजें। आपको इसे काम करने के लिए '/' पर स्विच करने की आवश्यकता है (मैं win10 का उपयोग कर रहा हूँ)
Rsc Rsc

4
LOCAL का उपयोग करें। LOAD DATA LOCAL INFILE ...
मोटोलेटो

जवाबों:


473

यह इरादा के अनुसार काम कर रहा है। आपके MySQL सर्वर को --secure-file-private विकल्प के साथ शुरू किया गया है जो मूल रूप से उन निर्देशिकाओं से सीमित है जिनके उपयोग से आप फ़ाइलों को लोड कर सकते हैं LOAD DATA INFILE

आप SHOW VARIABLES LIKE "secure_file_priv";उस निर्देशिका को देखने के लिए उपयोग कर सकते हैं जिसे कॉन्फ़िगर किया गया है।

आपके पास दो विकल्प हैं:

  1. द्वारा निर्दिष्ट निर्देशिका में अपनी फ़ाइल ले जाएँ secure-file-priv
  2. अक्षम करें secure-file-priv। इसे स्टार्टअप से हटा दिया जाना चाहिए और गतिशील रूप से संशोधित नहीं किया जा सकता है। ऐसा करने के लिए अपने MySQL स्टार्ट अप पैरामीटर (प्लेटफॉर्म पर निर्भर करता है) और my.ini।

4
डिफ़ॉल्ट रूप से my.ini को W2012 सर्वर पर MySQL 5.6 चलाने पर "C: \ ProgramData \ MySQL \ MySQL Server 5.6" से पाया जा सकता है। आप सेवा स्टार्टअप मापदंडों (जैसे --defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini) को भी जांचना चाह सकते हैं क्योंकि वे भी --secure-file-privस्वयं को सूचीबद्ध कर सकते हैं ।
vhu

2
@Mohitbhasi, my-default.ini "C: \ Program Files \ MySQL \ MySQL Server 5.6" फ़ोल्डर में होना चाहिए। स्थान vhu "C: \ ProgramData \ MySQL \ MySQL Server 5.6" का उल्लेख कर रहा था। बस अगर आपने ध्यान नहीं दिया है।
नूरशोमिक

67
मान: NULL। एफएमएल।
विलियम एंट्रीकेन

11
ध्यान दें कि अगर "select .. in outfile" का उपयोग करना है तो आपको पूर्ण पथ निर्दिष्ट करना होगा और पूर्ण पथ कोSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight

9
"मापदंडों की जाँच करें" और "my.ini की जाँच करें" बहुत अच्छा जवाब नहीं है
रोलैंड सेह्स

234

मेरी भी यही समस्या थी। मैंने आखिरकार LOCALकमांड में विकल्प का उपयोग करके हल किया

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

आप अधिक जानकारी यहाँ http://dev.mysql.com/doc/refman/5.7/en/load-data.html से प्राप्त कर सकते हैं

यदि LOCAL निर्दिष्ट किया जाता है, तो फ़ाइल क्लाइंट होस्ट पर क्लाइंट प्रोग्राम द्वारा पढ़ी जाती है और सर्वर पर भेजी जाती है। फ़ाइल को उसके सटीक स्थान को निर्दिष्ट करने के लिए पूर्ण पथ नाम के रूप में दिया जा सकता है। यदि एक रिश्तेदार पथ नाम के रूप में दिया जाता है, तो नाम उस निर्देशिका के सापेक्ष व्याख्या किया जाता है जिसमें क्लाइंट प्रोग्राम शुरू किया गया था।


2
यह मेरे लिए काम करता है और कोई नहीं। मैंने कोशिश की: 1. में मेरी txt फ़ाइल अपलोड करने के लिए C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. अक्षम करने और mysql को पुनरारंभ करने secure_file_privमें my.ini3. यह एक! धन्यवाद :)
कमल नयन

10
मुझे यह त्रुटि संदेश MariaDB के लिए मिला: "ERROR 1148 (42000): इस MariaDB संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है"। सटीक संस्करण: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, लिनक्स के लिए (x86_64) रीडलाइन 5.2 का उपयोग करके"
jciloa

11
मुझे mysql संस्करण 5.7.19 के लिए "इस MySQL संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है"।
एलिसन एस

2
@ एलिसन दौड़ते --local-infileसमय ध्वज को जोड़ने का प्रयास करें mysqlstackoverflow.com/questions/10762239/…
इल्या मोस्कविन

1
The used command is not allowed with this MySQL versionMySQL 8.0 से
बिटफिशियज़

117

Ubuntu 14 और Mysql 5.5.53 पर यह सेटिंग डिफ़ॉल्ट रूप से सक्षम होने लगती है। इसे अक्षम करने के लिए आपको secure-file-priv = ""mysqld config ग्रुप के तहत अपने my.cnf फ़ाइल को जोड़ना होगा। जैसे: -

[mysqld]
secure-file-priv = ""

1
यह मेरे लिए भी काम किया। उबंटू और MySQL का एक ही संस्करण
रॉडने

1
+1 ने मेरे लिए काम किया। यदि आप उबंटू का उपयोग कर रहे हैं, तो mysql सेवा को न भूलें: sudo service mysql पुनरारंभ
एमिलियानो सांगो

1
यह तब काम करता है जब आपको उस स्थान को इंगित करने की आवश्यकता होती है जिसे आप प्रति कथन चुनते हैं जहां लागू हो। यह MySQL 5.7 के साथ विंडोज सर्वर पर काम करता है जैसा आपने समझाया था। यदि आप बस इस तरह की टिप्पणी करते हैं # secure-file-priv = ~तो यह अभी भी त्रुटि है क्योंकि मूल्य दिखाता है क्योंकि NULLयह इस तरह से समस्या को हल करता है जब आप चुनना चाहते हैं कि आप कौन सी निर्देशिकाओं को सर्वर पर निर्यात कर सकते हैं, आदि
Bitcoin Murderous Maniac

1
विंडोज पर MySQL 5.7 के साथ मेरे लिए काम किया, जबकि अन्य समाधान नहीं किया।
CGritton

NB: अगर डॉकटर में ऐसा कर रहे हैं, तो आपको डॉकटर कंटेनर को पुनरारंभ करना होगा।
user1717828

38

मैं डेबियन पर MySQL5.7.11 पर काम कर रहा हूं, जिस कमांड ने मेरे लिए डायरेक्टरी देखने का काम किया है वह है:

mysql> SELECT @@global.secure_file_priv;

के साथ SHOW VARIABLES LIKE "secure_file_priv";मुझे वह मिलता है ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existजो अन्य परिस्थितियों में भी फेंक दिया जाता है और मुझे अंततः इससे निपटना होगा। SELECT @@global.secure_file_priv;आदेश हालांकि अपेक्षित परिणाम का उत्पादन किया।
माजिद फौलादपुर

1
इसने मेरे लिए काम किया - उबंटू मैसूर 5.7.21: आउटपुट फ़ाइल को निर्देशिका /var/lib/mysql-files/output.txt
Shanemeister

2
फिर आप इसे कैसे संपादित करते हैं? मैंने इसे /etc/mysql/my.cnf में संपादित करने का प्रयास किया और इसका कोई असर नहीं हुआ - यह NULL
Slavik

24

यहाँ विंडोज 7 में मुझे निष्क्रिय करने के लिए क्या काम किया गया है secure-file-priv( vhu के उत्तर से विकल्प # 2 ):

  1. में जाकर MySQL सर्वर सेवा बंद करें services.msc
  2. पर जाएं C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDataमेरे मामले में एक छिपा हुआ फ़ोल्डर था)।
  3. my.iniनोटपैड में फ़ाइल खोलें ।
  4. 'सुरक्षित-फ़ाइल-निजी' के लिए खोजें।
  5. लाइन की शुरुआत में '#' जोड़कर लाइन बाहर की टिप्पणी करें। MySQL सर्वर 5.7.16 और इसके बाद के संस्करण के लिए, टिप्पणी करने से काम नहीं चलेगा। आपको इसे इस तरह एक खाली स्ट्रिंग पर सेट करना होगा -secure-file-priv=""
  6. फ़ाइल सहेजें।
  7. में जाकर MySQL सर्वर सेवा शुरू करें services.msc

16
MySQL सर्वर 5.7.16 के अनुसार, लाइन पर टिप्पणी करने से काम नहीं चलेगा, क्योंकि तब यह डिफ़ॉल्ट पर वापस आ जाएगा, जो आयात और निर्यात कार्यों को अक्षम करता है। यदि आप किसी भी निर्देशिका से इन कार्यों को अनुमति देना चाहते हैं, तो अब आपको इसे एक रिक्त स्ट्रिंग पर सेट करने की आवश्यकता है।
dbc

1
रामनाथ, कृपया अपना उत्तर 5.7.x संस्करण के लिए @dbc विवरण के साथ संपादित करें। धन्यवाद।
राफेल गोम्स फ्रांसिस्को

मेरे लिए एक खाली स्ट्रिंग जोड़ना; कृपया सुरक्षित-फ़ाइल-निजी = "" की तरह खाली स्ट्रिंग जोड़ने का उत्तर बदलें
राजेश गोयल

विंडोज के लिए फॉरवर्ड स्लैश का उपयोग करना सुनिश्चित करें
ओलिवर ओलिवर

22

यदि फ़ाइल आपकी मशीन के लिए स्थानीय है तो अपने कमांड में LOCAL का उपयोग करें

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

14

@vhu

मैंने किया SHOW VARIABLES LIKE "secure_file_priv";और C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\जब मैंने प्लग इन किया तो यह वापस आ गया, फिर भी यह काम नहीं किया।

जब मैं सीधे my.ini फ़ाइल में गया तो मुझे पता चला कि रास्ता थोड़ा अलग तरीके से तैयार किया गया है: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

फिर जब मैंने इसके साथ इसे चलाया, तो इसने काम किया। एकमात्र अंतर स्लैश की दिशा है।


आपके जवाब ने मेरे लिए काम किया, एक बहुत
बेनौ मौद

हां हां हां ... यह जवाब अब तक नीचे क्यों है। मैं लंबे समय के लिए संघर्ष किया और फिर मिल गया। मैं इसे उत्तर के रूप में जोड़ने के लिए वापस आया, लेकिन यह इतना नीचे है कि मैंने अपना समय बर्बाद करने से पहले इसे नहीं देखा।
रु।

सभी हीरोज टोपी नहीं पहनते हैं।
जेआरके

8

मुझे 'सिक्योर-फाइल-प्राइवेट' के साथ भी यही समस्या थी। .Ini फ़ाइल में टिप्पणी करना काम नहीं करता था और न ही 'सुरक्षित-फ़ाइल-निजी' द्वारा निर्दिष्ट निर्देशिका में चलती फ़ाइल थी।

अंत में, जैसा कि dbc ने सुझाव दिया है, एक खाली स्ट्रिंग के बराबर 'सिक्योर-फाइल-प्राइवेट' बनाने का काम किया है। इसलिए यदि कोई भी उपरोक्त उत्तर की कोशिश करने के बाद फंस गया है, तो उम्मीद है कि ऐसा करने से मदद मिलेगी।


8

मेरे लिए काम की चीज़:

  1. में निर्दिष्ट फ़ोल्डर के अंदर अपनी फ़ाइल रखो secure-file-priv

उस प्रकार को खोजने के लिए:

mysql> "safe_file_priv" जैसे चर दिखाएं;


  1. अगर आपके पास है तो जांच करें local_infile = 1

वह टाइपिंग करें:

mysql> "local_infile" जैसे चर दिखाएं;

अगर तुम्हे मिले:

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

फिर इसे एक टाइपिंग पर सेट करें:

mysql> set global local_infile = 1;


  1. अपनी फ़ाइल के लिए पूर्ण पथ निर्दिष्ट करें। मेरे मामले में:

mysql> डेटा डेटा को "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" टेबल टेस्ट में लोड करें;


6

इस पोस्ट के समय इस धागे को 522k बार देखा गया है । ईमानदारी से जब MySQL सुरक्षात्मक अनुचित माँ पर हमारी हो गई ? सुरक्षा में एक समय लेने वाला प्रयास - जो वास्तव में केवल हमें झकझोरने का काम करता है!

कई खोजों और कई प्रयासों के बाद सब कुछ विफल हो गया।
मेरा समाधान:

  1. पुराने बॉक्स पर PhpMyAdmin आयात के माध्यम से .csv फ़ाइल आयात करें (यदि बड़ी cmd लाइन पर करते हैं)
  2. .sql फ़ाइल जनरेट करें
  3. डाउनलोड .sql फ़ाइल
  4. आयात .sql फ़ाइल MySQL काम बेंच के माध्यम से

3

मुझे इससे हर तरह की समस्या थी। मैं my.cnf और सभी प्रकार की पागल चीजों को बदल रहा था जिन्हें इस समस्या के अन्य संस्करणों ने दिखाने की कोशिश की।

मेरे लिए क्या काम किया:

जो त्रुटि मुझे मिल रही थी

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

मैं इसे /usr/local/mysql/support-files/mysql.server खोलकर और निम्न पंक्ति बदलकर ठीक करने में सक्षम था:

$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

यदि आप उबंटू में चल रहे हैं, तो आपको MySQL को अपने फ़ोल्डर में लिखने की अनुमति देने के लिए Apparmor को कॉन्फ़िगर करने की आवश्यकता हो सकती है, जैसे यहाँ मेरा कॉन्फ़िगरेशन है:

इस लाइन को फाइल /etc/apparmor.d/usr.sbin.mysqld में जोड़ें:

/var/lib/mysql-files/* rw

फिर इन 2 कॉन्फ़िगर लाइनों को /etc/mysql/my.cnf वर्गों में जोड़ें:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

यहाँ मेरी SQL है:

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

इसने मेरे लिए काम किया। सौभाग्य!


हां "/var/lib/mysql-files/filename.csv" के साथ आउटफिट रास्ता मेरे लिए काम कर रहा है।
आयुध भटनागर

3

Mysql 8.0 संस्करण के लिए आप यह कर सकते हैं:

  1. mysql.server रोकें
  2. mysql.server start --secure-file-private = ''

इसने मेरे लिए मैक हाई सिएरा पर काम किया


3

यदि आप नोडजेएस चला रहे हैं तो मैंने एक एनओडीजेएस आयात स्क्रिप्ट बनाई है और आप डेटा निम्न रूप में हैं (दोहरी बोली + अल्पविराम और \ n नई पंक्ति)

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

इसे http: // localhost: 5000 / import पर चलाने के लिए कॉन्फ़िगर किया गया है ।

मैं लाइन से लाइन जाता हूं और क्वेरी स्ट्रिंग बनाता हूं

"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 कॉन्फिग फाइल है

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;

डिस्क्लेमर: यह एक सटीक समाधान नहीं है - मैं इसे केवल उन देवों के लिए पोस्ट कर रहा हूं, जिनके पास समयरेखा के तहत आयात करने के लिए बहुत सारे डेटा हैं और इस हास्यास्पद मुद्दे का सामना कर रहे हैं। मैंने इस पर बहुत समय खो दिया है और मैं एक और देव को उसी खोए हुए समय को बख्शने की उम्मीद करता हूं।


1

मुझे विंडोज़ 10 पर यह समस्या थी। "

  1. विंडोज़ सर्च में (नीचे बाईं ओर) मैंने "पावरशेल" टाइप किया।
  2. अधिकार पर क्लिक किया और व्यवस्थापक के रूप में भाग गया।
  3. सर्वर बिन फ़ाइल में नेविगेट किया गया। (C: \ Program Files \ MySQL \ MySQL सर्वर 5.6 \ bin);
  4. टाइप किया हुआ ।/mysqld
  5. हिट "दर्ज करें"

सर्वर उम्मीद के मुताबिक शुरू हुआ।


1

MySQL इस सिस्टम वेरिएबल का उपयोग यह नियंत्रित करने के लिए करता है कि आप कहाँ से फाइल आयात कर सकते हैं

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

तो समस्या यह है कि सिस्टम चर को कैसे बदला जाए secure_file_priv

  1. बंद करना mysqld
  2. sudo mysqld_safe --secure_file_priv=""

अब आप इस तरह देख सकते हैं:

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

0

MacOS कैटालिना में, मैंने सेट करने के लिए इस कदम का पालन किया secure_file_priv

1.Stop MySQL सेवा

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

2.Restart MYSQL असाइन --secure_file_priv सिस्टम वैरिएबल

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

नोट: मेरे लिए खाली मान जोड़ने से समस्या ठीक हो जाएगी, और MYSQL डायरेक्ट्री / usr / लोकल / mysql / डेटा / your_DB_TABLE / EXPORT_FILE को डेटा निर्यात करेगा

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

धन्यवाद


0

किसी भी विन्यास फाइल को बदले बिना ।।

  1. secure_file_priv@vhu द्वारा पोस्ट की गई कमांड का उपयोग करने का मूल्य देखें SHOW VARIABLES LIKE "secure_file_priv":।
  2. अपनी क्वेरी के लिए पूर्ण पथ निर्धारित करें जैसे: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

इसने ubuntu 18.04 LTS mysql 5.7.29 पर mysql-shell में मेरे लिए काम किया

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.