MySQL में लोड डेटा इनफ़ाइल के लिए पहुँच अस्वीकृत


105

मैं PHP में हर समय MySQL प्रश्नों का उपयोग करता हूं, लेकिन जब मैं कोशिश करता हूं

LOAD DATA INFILE

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

# 1045 - उपयोगकर्ता के 'उपयोगकर्ता' @ 'लोकलहोस्ट' (पासवर्ड का उपयोग कर: YES) के लिए प्रवेश निषेध

क्या किसी को पता है कि इसका क्या मतलब है?

जवाबों:


197

मैं बस इस मुद्दे में भाग गया। मुझे LOCALअपने SQL स्टेटमेंट में जोड़ना था ।

उदाहरण के लिए, यह अनुमति समस्या देता है:

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

LOCALअपने बयान में जोड़ें और अनुमतियाँ समस्या दूर होनी चाहिए। इस तरह:

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
यह एक अलग बात करता है। यह आपकी फ़ाइल को अस्थायी निर्देशिका में सर्वर पर अपलोड करता है। यह कभी-कभी आवश्यक होता है, लेकिन यदि शिशु पहले से ही MySQL सर्वर पर है, तो आप केवल निरर्थक कार्य कर रहे हैं।
jeffcook2150

1
हाँ, यह मेरे लिए चाल है, मैं ssh पर डेटाबेस सर्वर पोर्ट को अग्रेषित कर रहा था और मुझे लगता है कि यह दूरस्थ डेटाबेस सर्वर पर फ़ाइल को LOCAL भाग के बिना देख रहा था
माइक

2
मेरे लिए @jeremysawesome यह निम्नलिखित त्रुटि उत्पन्न करता है: त्रुटि कोड: 1148 इस MySQL संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है। मैंने इस समस्या के लिए कुछ उत्तर देने की कोशिश की जैसे कि mysql फ़ाइल को स्थानीय-शिशु = 1 में संशोधित करना और वह भी विफल रहा।
ऑरवेलहिंडेनबर्ग

MySQL के एक अद्यतन के लिए 6.2.5 ने मेरे लिए इस समस्या को हल किया
OrwellHindenberg

4
आपको --local-infileविकल्प के साथ mysql भी कॉल करना पड़ सकता है।
शब्बीशेफ

32

मुझे यह समस्या थी। मैंने आसपास खोज की और कोई संतोषजनक उत्तर नहीं मिला। मैं अपनी खोजों के परिणामों को संक्षेप में बताता हूं।

पहुँच अस्वीकृत त्रुटि का अर्थ हो सकता है:

  • 'उपयोगकर्ता' @ 'लोकलहोस्ट' के पास फील विशेषाधिकार ( GRANT FILE on *.* to user@'localhost') नहीं है; या,
  • जिस फ़ाइल को आप लोड करने का प्रयास कर रहे हैं वह mysql सर्वर चलाने वाली मशीन पर मौजूद नहीं है (यदि LOAD DATA INFILE का उपयोग कर रहा है); या,
  • जिस फ़ाइल को आप लोड करने का प्रयास कर रहे हैं वह आपके स्थानीय मशीन पर मौजूद नहीं है (यदि LOAD DATA LOCAL INFILE का उपयोग कर रहा है); या,
  • जिस फ़ाइल को आप लोड करने का प्रयास कर रहे हैं वह दुनिया में पढ़ने योग्य नहीं है (आपको फ़ाइल और सभी पैरेंट निर्देशिकाओं को विश्व-पठनीय होने की आवश्यकता है: chmod 755 निर्देशिका; और, chmod 744 file.dat)

+1: यह मेरे लिए काम करता है: जिस फ़ाइल को आप लोड करने का प्रयास कर रहे हैं वह दुनिया में पढ़ने योग्य नहीं है (आपको फ़ाइल और सभी पैरेंट निर्देशिकाओं को विश्व-पठनीय होने की आवश्यकता है: chmod 755 निर्देशिका; और, chmod 744 file.dat) । मैंने अपने सभी डाइरेक्टरी
gavdotnet

1
उपयोगकर्ता तातियाना बताते हैं कि आप प्रति डेटाबेस में केवल पाँच विशेषाधिकार नहीं दे सकते, केवल पूरे सर्वर के लिए। अनुदान आदेश "पर GRANT फ़ाइल होगा उपयोगकर्ता के लिए @ 'स्थानीय होस्ट' द्वारा 'पासवर्ड') की पहचान,"
JAL

3
@ मुझे लगता है कि आप का मतलब है "उपयोगकर्ता पर *। * उपयोगकर्ता के लिए ..." - शायद तारांकन अक्षर छीन लिए गए थे
यूजीन एम

जैसा कि @ यूजीन एम ने कहा कि इससे DB GRANT और GLOBAL PRIVILEGES का गलत उपयोग गलत है
लेखाकार م

19

इस आदेश का उपयोग करने का प्रयास करें:

load data local infile 'home/data.txt' into table customer;

यह काम करना चाहिए। इसने मेरे मामले में काम किया।


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
स्टीवर्ट

@ स्टीवर्ट, कृपया उपरोक्त आदेश से 'स्थानीय' हटा दें। बाद में mysql संस्करण इस ध्वज का समर्थन नहीं करते हैं जब वैश्विक चर 'local_infile' चर 'ON' (नीचे के रूप में) पर सेट होता है। इसलिए आज्ञा होगी; mysql> तालिका ग्राहक में 'डेटा / होम / data.txt' डेटा लोड करें; + --------------- + ------- + | चर_नाम | मान | + --------------- + ------- + | local_infile | पर | + --------------- + ------- +
कामरान हैदर

@KamranHyder लगता है कि आपके पास मेरे लिए एक अच्छा जवाब है। इसे पूर्ण उत्तर के रूप में क्यों नहीं जोड़ा गया?
स्टीवर्ट

10

सुनिश्चित करें कि आपके MySQL उपयोगकर्ता को FILE विशेषाधिकार प्रदान किया गया है।

यदि आप साझा वेब होस्टिंग पर हैं, तो एक मौका है कि यह आपके होस्टिंग प्रदाता द्वारा अवरुद्ध है।


एक साझा वेब होस्टिंग पर: "LOAD DATA LOCAL INFILE" का उपयोग करना मददगार होगा?
पीटर

3

ल्यों से स्ट्रिंग ने मुझे बहुत अच्छी टिप दी: विंडोज पर, हमें स्लैश का उपयोग करने की आवश्यकता है, न कि बैकस्लैश की। यह कोड मेरे लिए काम करता है:

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

मैं एक ही मुद्दे में भाग गया, और इसे हल करके उन चरणों को हल करें:

  • load_infile वैरिएबल सक्रिय करें
  • मेरे कस्टम mysql उपयोगकर्ता के लिए भव्य फ़ाइल अनुमति
  • Secure_file_priv चर निष्क्रिय करें (मेरी फ़ाइल वेबसर्वर द्वारा / tmp फ़ोल्डर में अपलोड की गई थी, जो निश्चित रूप से myslq / var / lib / mysql-file की सुरक्षित निर्देशिका नहीं है)

इस तीसरे बिंदु के लिए, आप यहां देखें: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv

बीआर,


2

यह मेरे साथ भी हुआ और यामीर द्वारा बताए गए सभी चरणों का पालन करने के बावजूद मैं इसे काम नहीं कर सका।

फ़ाइल 777 अनुमतियों के साथ /tmp/test.csv में थी। MySQL उपयोगकर्ता के पास फ़ाइल अनुमति थी, LOCAL विकल्प को मेरे MySQL संस्करण द्वारा अनुमति नहीं दी गई थी, इसलिए मैं फंस गया था।

अंत में मैं दौड़ कर समस्या को हल करने में सक्षम था:

sudo chown mysql:mysql /tmp/test.csv

2

यदि आप कमांड लाइन का उपयोग कर रहे हैं तो मुझे एक आसान लगा

इससे लॉगिन करेंmysql -u[username] -p[password] --local-infile

फिर SET GLOBAL local_infile = 1;

द्वारा अपने डेटाबेस का चयन करें use [db_name]

और अंत में LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


--लोक-इनलाइन को जोड़ने से मुझे मदद मिली। हालाँकि, मेरे मामले में पहले से ही स्थानीय_इनफाइल ग्लोबल वैरिएबल ऑन था। मुझे लगता है कि उपयोगकर्ताओं को पहले यह पता लगाना बेहतर होगा कि उन्होंने इस चर में किस मूल्य को संशोधित करने से पहले लिखा है।
यूजीन मेयसुक

RDS उपयोगकर्ताओं के लिए => - the -ocal-infile को जोड़ने से RDS पर मुझे मदद मिली, हालाँकि SET GLOBAL local_infile = 1;RDS में काम करने के लिए प्रतीत नहीं होता है, लेकिन वैसे भी इसके बिना --local-infileचाल चली
Fact

0

मुझे पता चला कि MySQL टेबल लोड करना तेज और दर्द रहित हो सकता है (मैं अजगर / Django मॉडल मैनेजर स्क्रिप्ट का उपयोग कर रहा था):

1) सभी स्तंभों के साथ तालिका बनाएं VARCHAR (n) पूर्ण उदाहरण:

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) सीएसवी से हेडर (पहली पंक्ति) को हटा दें, फिर लोड करें (यदि आप LOCAL को भूल जाते हैं, तो आपको "# 1045 - उपयोगकर्ता के उपयोगकर्ता '@' लोकलहोस्ट '(पासवर्ड का उपयोग करते हुए एक्सेस करने से इनकार कर दिया जाएगा):")

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) कॉलम बदलें:

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

देखा!


-5

इसका शायद मतलब है कि आपके द्वारा दिया गया पासवर्ड 'user'@'localhost'गलत है।


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