जवाबों:
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] खंड में भी परिभाषित किया गया है ताकि "स्थानीय शिशु" सुविधा सर्वर पक्ष को सक्षम किया जा सके।
यह एक सुरक्षा प्रतिबंध है।
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 सेवा को फिर से लोड।
आपके द्वारा संपादित की जाने वाली 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 पर काम करता है।
Ubuntu 14.04.2 LTS not working
।
/mysql/my.cnf
डिफ़ॉल्ट रूप से मौजूद नहीं है। बस निर्देशिका और फ़ाइल बनाएँ, और इन पंक्तियों को फ़ाइल में पेस्ट करें।
/etc/mysql/conf.d/enable-local-infile.cnf
करने के sudo service mysql restart
बाद भूल न जाएं ताकि यह प्रभावी हो जाए।
मूल ड्राइवर द्वारा ड्राइवर php5-mysql को बदलें
डेबियन पर
apt-get install php5-mysqlnd
मैंने 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 है। शायद यह नवीनतम समाधान है। बहुत बहुत धन्यवाद।
8.0.12 MySQL Community Server
विंडोज पर काम किया ।
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
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';
नीचे देखें इमेज ...
मैंने --local-infile=1
सामान्य mysql कमांड में जोड़ा है mysql -u root -p
तो कुल लाइन होगी:
mysql - local-infile = 1 -u root -p
SET GLOBAL ..
नहीं किया। क्या कोई 'स्रोत' कमांड ( \. file.sql
) किसी तरह एक नया सत्र शुरू करता है या इसे रीसेट करता है? मैंने सेटिंग को mmy sql स्क्रिप्ट में डालने की कोशिश नहीं की, हालाँकि।
इसके अलावा, अन्य पाठकों के लिए, यदि आप 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,
},
}
}
आपको यह ध्यान रखना होगा कि आप अपने mysqli कनेक्शन को कैसे स्थापित करते हैं। इस समाधान का पूरा श्रेय स्रोत जोर्ज अल्बरेंक को जाता है
इसे ठीक करने के लिए मुझे:
पकड़ यह है कि उस फ़ंक्शन के साथ आप स्पष्ट रूप से 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);
अगर आपकी csv फाइल db के साथ ही स्थित है , तो आपको LOAD DATA INFILE में LOCAL को हटाने की आवश्यकता है , या आपको त्रुटि मिलेगी
इस MySQL संस्करण के साथ प्रयुक्त कमांड की अनुमति नहीं है
एक और तरीका mysqlimport
क्लाइंट प्रोग्राम का उपयोग करना है।
आप इसे इस प्रकार लागू करते हैं:
mysqlimport -uTheUsername -pThePassword --local yourDatabaseName tableName.txt
यह एक LOAD DATA
बयान उत्पन्न करता है जो इसमें लोड tableName.txt
होता हैtableName
तालिका ।
निम्नलिखित बातों का ध्यान रखें:
mysqlimport
आपके द्वारा प्रदत्त फ़ाइल से तालिका का नाम निर्धारित करता है; फ़ाइल नाम की शुरुआत से तालिका नाम के रूप में पहली अवधि तक सभी पाठ का उपयोग करना। इसलिए, यदि आप एक ही तालिका में कई फ़ाइलों को लोड करना चाहते हैं, तो आप उन्हें अलग कर सकते हैं tableName.1.txt
, जैसे tableName.2.txt
, ..., आदि, उदाहरण के लिए।
यह मेरे लिए थोड़ा अजीब था, एक दिन से लेकर अगले एक दिन तक जो स्क्रिप्ट काम कर रही थी वह बस काम करना बंद कर देती है। 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.
मैंने नीचे विधि का उपयोग किया है, जिसे 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"
ठीक है, यहाँ कुछ अजीब हो रहा है। इस काम को करने के लिए, /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 आधारित वितरण में मान्य
आप में से जो लोग LOCAL
मेरे जैसे LOAD DATA INFILE काम करने के लिए उत्तर खोज रहे हैं , यह शायद काम कर सकता है। वैसे यह मेरे लिए काम करता है, इसलिए यहाँ जाता है। percona
लिंक से चरणों का पालन करके अपने mysql सर्वर और क्लाइंट के रूप में स्थापित करें । स्थापना के दौरान एक पासवर्ड के लिए संकेत दिया जाएगा, इसलिए एक ऐसा प्रदान करें जिसे आप याद रखें और बाद में उसका उपयोग करें। एक इंस्टॉलेशन किया जाता है, अपने सिस्टम को रिबूट करें और परीक्षण करें यदि सर्वर ऊपर है terminal
और टाइप करके mysql -u root -p
और फिर पासवर्ड चलाकर चल रहा है । LOAD DATA LOCAL INFILE
अब कमांड चलाने की कोशिश करें .. आशा है कि यह काम करेगा :)
BTW I उबंटू 12.04 पर रूबी 1.9.3 के साथ रेल 2.3 पर काम कर रहा था।
local_infile
दोनों client
और mysqld
अनुभाग में जोड़ें ।
[client]
local_infile=1
...
[mysqld]
local_infile=1
...
MySQL 8.x में विंडोज और लिनक्स दोनों में परीक्षण किया गया।
मैं 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 को स्थानांतरित करना महत्वपूर्ण है। अन्यथा यह काम नहीं करेगा।
उपरोक्त सभी सुझावों के लिए धन्यवाद। एक संयोजन ने आखिरकार मेरे लिए काम किया।
my.cnf
रास्ता/etc/mysql/my.cnf
मेरी मशीन (AWS EC2) में है।