MySQL: LOAD DATA LOCAL INFILE को सक्षम करें


127

मैं Ubuntu 12 LTS पर मैसूर 5.5 चला रहा हूँ। मैं अपने.cnf में LOAD DATA LOCAL INFILE को कैसे सक्षम करूं?

मैंने विभिन्न स्थानों पर अपने विन्यास में स्थानीय-शिशु को जोड़ने की कोशिश की है, लेकिन मुझे अभी भी "इस माया संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है"

जवाबों:


197

MySQL 5.5 मैनुअल पेज से:

LOCAL केवल तभी काम करता है जब आपके सर्वर और आपके क्लाइंट दोनों को इसे अनुमति देने के लिए कॉन्फ़िगर किया गया हो। उदाहरण के लिए, यदि mysqld को --local-infile = 0 के साथ शुरू किया गया था, तो LOCAL काम नहीं करता है। खंड 6.1.6, “सुरक्षा आंकड़ों के साथ सुरक्षा मुद्दे” देखें।

आपको विकल्प सेट करना चाहिए:

local-infile=1

अपने [mysql] my.cnf फ़ाइल में प्रवेश करें या --local-infile विकल्प के साथ mysql क्लाइंट को कॉल करें :

mysql --local-infile -uroot -pyourpwd yourdbname

आपको यह सुनिश्चित करना होगा कि वही पैरामीटर आपके [mysqld] खंड में भी परिभाषित किया गया है ताकि "स्थानीय शिशु" सुविधा सर्वर पक्ष को सक्षम किया जा सके।

यह एक सुरक्षा प्रतिबंध है।


4
धन्यवाद। btw, my.cnfरास्ता /etc/mysql/my.cnfमेरी मशीन (AWS EC2) में है।
स्पार्कआंडशाइन

दिलचस्प बात यह है कि my.cnf फाइल मेरे लिए / etc डायरेक्टरी में थी।
18 सितंबर को SgtRock

अगर यह अभी भी विफल रहता है, तो कहाँ जाना है पर कोई विचार। मैंने [क्लाइंट], [mysqld], और [mysql] के तहत my.cnf फ़ाइल में स्थानीय-शिशु = 1 जोड़ा है और इनमें से संयोजन का उपयोग किया है। सभी एक ही परिणाम के साथ। मैंने कार्यक्षेत्र को फिर से शुरू करने की कोशिश की है, लेकिन कोई भाग्य नहीं। मैंने रोक दिया है और प्रत्येक परिवर्तन के बीच mySQL कार्यक्षेत्र भी शुरू कर दिया है।
ऑरवेलहिंडेनबर्ग

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

इसका उत्तर सही दिशा में है। लेकिन जो लोग इस समस्या का सामना कर रहे हैं उनके लिए यहां एक और गेटा है। यदि आपके पास आपके सिस्टम पर एपरमोर सक्षम है और समस्या बनी रहती है, तो यह देखने के लिए कि क्या mysqld डेमॉन को अवरुद्ध किया जा रहा है, तब syslog की जांच करें। मुझे यह समस्या थी apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/var/www/myfile.csv" pid=19488 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=106 ouid=33:। समाधान बहुत सरल है। बस अपने अद्यतन /etc/apparmor.d/local/usr.sbin.mysqldऔर apparmor सेवा को फिर से लोड।
सिंह

60

आपके द्वारा संपादित की जाने वाली my.cnf फ़ाइल /etc/mysql/my.cnf फ़ाइल है। बस:

sudo nano /etc/mysql/my.cnf

फिर जोड़िए:

[mysqld]
local-infile 

[mysql]
local-infile 

हेडर [mysqld] और [mysql] पहले से ही दिए गए हैं, बस उन्हें फ़ाइल में ढूंढें और उनमें से प्रत्येक के नीचे स्थानीय-शिशु जोड़ें ।

यह मेरे लिए Ubuntu 12.04 LTS पर MySQL 5.5 पर काम करता है।


1
यह निश्चित रूप से मेरे लिए Ubuntu 12.04 के साथ तय किया।
जॉन फियाला

4
मैं भी पुष्टि कर सकता हूँ Ubuntu 14.04.2 LTS not working
ऐन तोवहरी

मैक के लिए भी काम करता है। मैक उपयोगकर्ता के लिए, /mysql/my.cnfडिफ़ॉल्ट रूप से मौजूद नहीं है। बस निर्देशिका और फ़ाइल बनाएँ, और इन पंक्तियों को फ़ाइल में पेस्ट करें।
झेंग लियू

यदि आप नहीं चाहते कि यह कॉन्फ़िगरेशन mysql के अपग्रेड होने पर अधिलेखित हो जाए, तो आपको इसे भी डाल देना चाहिए ताकि कॉन्फ़िगरेशन परिवर्तन /etc/mysql/conf.d/enable-local-infile.cnf करने के sudo service mysql restartबाद भूल न जाएं ताकि यह प्रभावी हो जाए।
स्टीफन ओस्टरमिलर

यह उचित समाधान है। उच्चतम उत्थान किया गया समाधान यह उल्लेख करने में विफल रहता है कि आपको [mysqld] लाइन लोकल-इनफाइल से पहले डालनी है।
user3260912 19

30

मूल ड्राइवर द्वारा ड्राइवर php5-mysql को बदलें

डेबियन पर

apt-get install php5-mysqlnd

यह काम किया! 12.04 ubuntu स्टॉक स्टॉक का उपयोग करते हुए, मुझे 'स्थानीय' की आवश्यकता थी क्योंकि मैं आरडीएस से जुड़ रहा हूं। बहुत - बहुत धन्यवाद!
जेम्स बॉलर

बहुत बहुत धन्यवाद, इस समाधान ने मेरे लिए काम किया। मैंने प्रश्न पूछा है stackoverflow.com/questions/36526102/…
user75472

कोई सफलता ubuntu 12.04
Zbyszek

एक और खुश ग्राहक! ubuntu 14.04 mysql 5.7
nodoze

27

मैंने MySQL टर्मिनल कमांड के साथ MySQL 8.0.11 पर इस समस्या को हल किया:

SET GLOBAL local_infile = true;

मेरा मतलब है कि मैंने पहले हमेशा की तरह लॉग इन किया:

mysql -u user -p*

उसके बाद आप कमांड के साथ स्थिति देख सकते हैं:

SHOW GLOBAL VARIABLES LIKE 'local_infile';

यह चालू होना चाहिए। मैं स्थानीय फ़ाइलों को डेटाबेस में लोड करने के साथ जारी सुरक्षा के बारे में नहीं लिखूंगा।


मैंने कई अन्य समाधानों की कोशिश की, लेकिन केवल कमांड SET GLOBAL local_infile = true; काम करता है। मेरा MySQL संस्करण 8.0.12 है। शायद यह नवीनतम समाधान है। बहुत बहुत धन्यवाद।
मैथ्यू मुँह

1
सर्वर को पुनरारंभ करने के बाद दुर्भाग्य से चर फिर से बंद है।
पेड्रो

मोहित, किसी तरह मैंने इसे हल किया, क्योंकि अब वैश्विक चर 'local_infile' हमेशा ऑन है, रिबूट के बाद भी। और ऐसा लगता है कि मैंने इसके लिए my.cnf फ़ाइल का उपयोग नहीं किया। क्या आप, कृपया, PhpMyAdmin में प्रवेश करने का प्रयास कर सकते हैं, नवीनतम संस्करण, रूट के रूप में, वैरिएबल अनुभाग पर जाएं, 'local_infile' खोजें, फिर संपादन पर क्लिक करें, और इसे ON में बदलें, और अंत में Enter दबाएं। काम किया?
ओलेक्सी मुगलयेव

2
केवल इस जवाब ने मेरे लिए 8.0.12 MySQL Community Serverविंडोज पर काम किया ।
एंडवो 64

मेरे पास MySQL 8.0.16 विंडोज सर्वर 2016 पर स्थापित है, मैंने SET GLOBAL local_infile = true;कमांड को निष्पादित किया है लेकिन मुझे अभी भी वही त्रुटि मिल रही है ERROR 1148 (42000): The used command is not allowed with this MySQL versionलेकिन mysql का कनेक्शन --लोड-इनफाइल = 1 काम के साथmysql --local-infile=1 -u root -p
जूनियर

13

ubuntu पर mysql के अपने स्वाद के मामले में किसी भी परिस्थिति में काम नहीं करता है और आपको अभी भी 1148 त्रुटि मिलती है, आप load data infileकमांड लाइन के माध्यम से कमांड चला सकते हैं

एक टर्मिनल विंडो खोलें

Daud mysql -u YOURUSERNAME -p --local-infile YOURDBNAME

आपसे mysqluser पासवर्ड डालने का अनुरोध किया जाएगा

आप MySQLMonitor चला रहे होंगे और आपका कमांड प्रॉम्प्ट होगा mysql>

अपना load data infileआदेश चलाएं (अर्धविराम के साथ समाप्त करना न भूलें ; )

इस तरह:

load data local infile '/home/tony/Desktop/2013Mini.csv' into table Reading_Table FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

9

नीचे देखें इमेज ...

मैंने --local-infile=1सामान्य mysql कमांड में जोड़ा है mysql -u root -p

तो कुल लाइन होगी:

mysql - local-infile = 1 -u root -p

यहाँ छवि विवरण दर्ज करें


यह मेरे लिए काम किया जब SET GLOBAL ..नहीं किया। क्या कोई 'स्रोत' कमांड ( \. file.sql) किसी तरह एक नया सत्र शुरू करता है या इसे रीसेट करता है? मैंने सेटिंग को mmy sql स्क्रिप्ट में डालने की कोशिश नहीं की, हालाँकि।
टॉडकूफमैन

5

इसके अलावा, अन्य पाठकों के लिए, यदि आप Django में ऐसा करने की कोशिश कर रहे हैं और आपका सर्वर local_infile (आप mysql क्लाइंट के माध्यम से SHOW VARIABLES टाइप करके देख सकते हैं) की अनुमति देता है, तो आप इसे अपनी सेटिंग्स में शामिल कर सकते हैं फ़ाइल (जब से MythyDn MySQLdb doesn ' t डिफ़ॉल्ट रूप से .my.cnf फ़ाइल पढ़ें):

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydb',
        'USER': 'myname',
        'PASSWORD': 'mypass',
        'HOST': 'myserver',
        'PORT': '3306',
        'OPTIONS' : {
            'local_infile':1,
        },
    }
}

3

आपको यह ध्यान रखना होगा कि आप अपने mysqli कनेक्शन को कैसे स्थापित करते हैं। इस समाधान का पूरा श्रेय स्रोत जोर्ज अल्बरेंक को जाता है

इसे ठीक करने के लिए मुझे:

  • [Mysqld] और [mysql] my.cnf के वर्गों में स्थानीय-शिशु = १ जोड़ें (जैसा कि ऊपर टिप्पणियों में समझाया गया है)
  • Mysqli_real_connect फ़ंक्शन ( PHP प्रलेखन ) का उपयोग करें ।

पकड़ यह है कि उस फ़ंक्शन के साथ आप स्पष्ट रूप से LOAD DATA LOCAL INFILE के लिए समर्थन सक्षम कर सकते हैं। उदाहरण के लिए (प्रक्रियात्मक शैली):

$link = mysqli_init();
mysqli_options($link, MYSQLI_OPT_LOCAL_INFILE, true);
mysqli_real_connect($link, $host, $username, $password, $database);

या वस्तु उन्मुख

$mysqli = mysqli_init();
$mysqli->options(MYSQLI_OPT_LOCAL_INFILE, true);
$mysqli->real_connect($host, $username, $password, $database);

1
@ मास्क पुष्टि नहीं कर सकता। मेरा समाधान 5.5.46 (उबंटू) पर चल रहा है
sieppl

3

अगर आपकी csv फाइल db के साथ ही स्थित है , तो आपको LOAD DATA INFILE में LOCAL को हटाने की आवश्यकता है , या आपको त्रुटि मिलेगी

इस MySQL संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है


यह मेरे लिए था, लेकिन तब मुझे भी नेल्सन के जवाब का
डोमिनिक

1

एक और तरीका mysqlimportक्लाइंट प्रोग्राम का उपयोग करना है।

आप इसे इस प्रकार लागू करते हैं:

mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt

यह एक LOAD DATAबयान उत्पन्न करता है जो इसमें लोड tableName.txtहोता हैtableName तालिका ।

निम्नलिखित बातों का ध्यान रखें:

mysqlimportआपके द्वारा प्रदत्त फ़ाइल से तालिका का नाम निर्धारित करता है; फ़ाइल नाम की शुरुआत से तालिका नाम के रूप में पहली अवधि तक सभी पाठ का उपयोग करना। इसलिए, यदि आप एक ही तालिका में कई फ़ाइलों को लोड करना चाहते हैं, तो आप उन्हें अलग कर सकते हैं tableName.1.txt, जैसे tableName.2.txt, ..., आदि, उदाहरण के लिए।


1

यह मेरे लिए थोड़ा अजीब था, एक दिन से लेकर अगले एक दिन तक जो स्क्रिप्ट काम कर रही थी वह बस काम करना बंद कर देती है। Mysql का नया संस्करण या किसी भी प्रकार का अपग्रेड नहीं था, लेकिन मुझे वही त्रुटि मिल रही थी, इसलिए मैं CSV फ़ाइल को अंतिम प्रयास देता हूं और ध्यान देता हूं कि लाइनों का अंत अपेक्षित के बजाय \ n का उपयोग कर रहा था (मेरी स्क्रिप्ट के अनुसार) ) \ r \ n तो मैं इसे सही EOL के साथ सहेजता हूं और स्क्रिप्ट को बिना किसी परेशानी के फिर से चलाता हूं।

मुझे लगता है कि mysql के लिए यह बताना अजीब है कि प्रयुक्त कमांड को इस MySQL संस्करण के साथ अनुमति नहीं है क्योंकि कारण पूरी तरह से अलग था।

मेरा काम कमांड इस तरह दिखता है:

LOAD DATA LOCAL INFILE 'file-name' IGNORE INTO TABLE table-name CHARACTER SET latin1 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES.

1

मैंने नीचे विधि का उपयोग किया है, जिसे mysql-5.5.51-winx64 और 5.5.50-MariaDB पर परीक्षण किए गए कॉन्फ़िगरेशन में किसी भी बदलाव की आवश्यकता नहीं है :

.sql फ़ाइल में 'लोड डेटा ...' डालें (उदा: LoadTableName.sql)

LOAD DATA INFILE 'D:\\Work\\TableRecords.csv' INTO TABLE tbl1 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (col1,col2);

फिर:

mysql -uroot -pStr0ngP@ss -Ddatabasename -e "source D:\Work\LoadTableName.sql"

1

यदि मैसूर 5.7 हो तो आप "स्थानीय वैरिएबल" जैसे ग्लोबल वैरिएबल दिखा सकते हैं; " जो स्थानीय शैशव का दर्जा देगा, आप इसे "सेट ग्लोबल local_infile = ON;" का उपयोग करके चालू कर सकते हैं।


0

ठीक है, यहाँ कुछ अजीब हो रहा है। इस काम को करने के लिए, /etc/mysql/my.cnf में किसी भी तरह के कॉन्फ़िगरेशन परिवर्तन करने की आवश्यकता नहीं है। आपको बस टर्मिनल में वर्तमान mysql सेवा को फिर से शुरू करना है:

sudo service mysql restart

फिर अगर मैं बग को "रीक्रिएट" करना चाहता हूं, तो मैं बस अपाचे सेवा को फिर से शुरू करता हूं:

sudo service apache2 restart

जो निम्न कमांड दर्ज करके फिर से तय किया जा सकता है:

sudo service mysql restart

तो, ऐसा प्रतीत होता है कि अपाचे 2 इस सुविधा को शुरू होने की अनुमति नहीं देने के लिए कुछ कर रहा है (जो कि mysql सेवा को पुनरारंभ करने के बाद उलट / सही हो जाता है)।

डेबियन आधारित वितरण में मान्य।

service mysqld restart
service httpd restart

RedHat आधारित वितरण में मान्य


0

आप में से जो लोग LOCALमेरे जैसे LOAD DATA INFILE काम करने के लिए उत्तर खोज रहे हैं , यह शायद काम कर सकता है। वैसे यह मेरे लिए काम करता है, इसलिए यहाँ जाता है। perconaलिंक से चरणों का पालन करके अपने mysql सर्वर और क्लाइंट के रूप में स्थापित करें । स्थापना के दौरान एक पासवर्ड के लिए संकेत दिया जाएगा, इसलिए एक ऐसा प्रदान करें जिसे आप याद रखें और बाद में उसका उपयोग करें। एक इंस्टॉलेशन किया जाता है, अपने सिस्टम को रिबूट करें और परीक्षण करें यदि सर्वर ऊपर है terminalऔर टाइप करके mysql -u root -pऔर फिर पासवर्ड चलाकर चल रहा है । LOAD DATA LOCAL INFILEअब कमांड चलाने की कोशिश करें .. आशा है कि यह काम करेगा :)

BTW I उबंटू 12.04 पर रूबी 1.9.3 के साथ रेल 2.3 पर काम कर रहा था।


0

All: जाहिर है यह डिज़ाइन के अनुसार काम कर रहा है। कृपया नए रेफरी आदमी को दिनांक 2019-7-23, धारा 6.1.6, सुरक्षा मुद्दों के साथ LOAD DATA LOCAL देखें


0

local_infileदोनों clientऔर mysqldअनुभाग में जोड़ें ।

[client]
local_infile=1
...

[mysqld]
local_infile=1
...

MySQL 8.x में विंडोज और लिनक्स दोनों में परीक्षण किया गया।


0

मैं xampp v3.2.4 और mysql सर्वर 8.0.20 का उपयोग कर रहा हूं।

मैंने "my.ini" फ़ाइल में और जोड़ local-infile=1दिया । फ़ाइल "C: \ xampp \ mysql \ bin \ my.ini" पर स्थित है।[mysql][mysqld]

फिर मैंने निम्नलिखित कोड का उपयोग करके सीएसवी फ़ाइल से डेटा डाला LOAD DATA INFILE ...। LOCAL को स्थानांतरित करना महत्वपूर्ण है। अन्यथा यह काम नहीं करेगा।

उपरोक्त सभी सुझावों के लिए धन्यवाद। एक संयोजन ने आखिरकार मेरे लिए काम किया।

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