मैं MySQL Errcode 13 के बारे में SELECT INTO OUTFILE के साथ कैसे प्राप्त कर सकता हूं?


114

मैं एक MySQL सेलेक्ट इन्टु ओटमीटर स्टेटमेंट का उपयोग करके एक csv फ़ाइल में तालिका की सामग्री को डंप करने की कोशिश कर रहा हूं। यदि मैं करता हूँ:

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

outfile.csv को उसी निर्देशिका में सर्वर पर बनाया जाएगा जो इस डेटाबेस की फ़ाइलों में संग्रहीत है।

हालाँकि, जब मैं अपनी क्वेरी को इसमें बदलता हूँ:

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

मुझे मिला:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

Errcode 13 एक अनुमति त्रुटि है, लेकिन मैं इसे तब भी प्राप्त करता हूं, जब मैं mysql: mysql के लिए / डेटा का स्वामित्व बदलता हूं और इसे 777 अनुमतियां देता हूं। MySQL उपयोगकर्ता "mysql" के रूप में चल रहा है।

अजीब रूप से मैं फ़ाइल को / tmp में बना सकता हूं, बस मैंने किसी अन्य निर्देशिका में कोशिश नहीं की है, यहां तक ​​कि अनुमतियों के साथ सेट किया गया है ताकि उपयोगकर्ता mysql निर्देशिका में लिखने में सक्षम हो।

यह उबंटू पर चलने वाला MySQL 5.0.75 है।


3
13 को सिस्टम एरर के रूप में देखना, यह शायद ऐसा नहीं है, लेकिन एक निर्देशिका में एक ओटोमर को सीमित करने के लिए एक mySQL सेटिंग है: dev.mysql.com/doc/refman/5.0/en/ ... शायद एक त्वरित मूल्य के लायक है कि क्या यह है के लिए सेट /tmp
पेक्का

वह चर मेरी स्थापना पर रिक्त है, जो उस दस्तावेज़ के अनुसार मेरा आउटपुट निर्देशिका सीमित नहीं होना चाहिए।
रयान ओल्सन

जवाबों:


189

उबंटू का कौन सा विशेष संस्करण है और यह उबंटू सर्वर संस्करण है?

AppArmor और MySQL की प्रोफ़ाइल के साथ हाल ही में उबंटू सर्वर संस्करण (जैसे 10.04) जहाज डिफ़ॉल्ट रूप से लागू करने में हो सकता है। आप इसे इस sudo aa-statusतरह से निष्पादित करके देख सकते हैं :

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

यदि mysqld को enforce मोड में शामिल किया जाता है, तो यह संभवतः लेखन को नकारने वाला है। प्रविष्टियाँ भी /var/log/messagesतब लिखी जाएंगी जब AppArmor राइट्स / एक्सेस को ब्लॉक करता है। आप क्या कर सकते हैं संपादित करें /etc/apparmor.d/usr.sbin.mysqldऔर जोड़ने /data/और /data/*नीचे की तरह तो:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

और फिर AppArmor प्रोफाइल को फिर से लोड करें।

# sudo /etc/init.d/apparmor reload

चेतावनी: ऊपर दिया गया परिवर्तन MySQL को / डेटा निर्देशिका को पढ़ने और लिखने की अनुमति देगा। हमें उम्मीद है कि आप पहले से ही इस के सुरक्षा निहितार्थ पर विचार कर चुके हैं।


2
मैं इसे इंगित करने से नफरत करता हूं, लेकिन एक कारण है कि ऐप कवच इसकी अनुमति नहीं देता है। MySQL में अब / डेटा फ़ोल्डर में कुछ भी संशोधित करने और पढ़ने की क्षमता है। अभी हैक नहीं हुआ है।
रयान वार्ड

2
@Serdar, डिस्ट्रो के साथ वितरित AppArmor MySQL के नियम डिफ़ॉल्ट रूप से इसकी अनुमति नहीं देते हैं । यह समझ में आता है क्योंकि यह एक ताजा स्थापित करने के लिए नियमों का एक अच्छा आधार रेखा है। मेरा मानना ​​है कि हमें अपनी आवश्यकताओं के बाद स्थापित होने के लिए नियमों को संशोधित करने की अनुमति दी जानी चाहिए। माईएसक्यूएल को विशिष्ट निर्देशिकाओं को लिखने की अनुमति देने के लिए यह मूल प्रश्नकर्ता का इरादा था। लेकिन अगर यह ऊपर स्पष्ट रूप से स्पष्ट नहीं है, तो इस समाधान पर ठोकर खा रहे लोगों को बेहोश करने के लिए एक नोट: चेतावनी: ऊपर दिया गया बदलाव MySQL को / डेटा निर्देशिका को पढ़ने और लिखने की अनुमति देगा। हमें उम्मीद है कि आप पहले से ही इस के सुरक्षा निहितार्थ पर विचार कर चुके हैं।
विन-जी

1
बहुत बढ़िया जवाब!!! इसने मेरी समस्या हल कर दी, मैं किसी अन्य निर्देशिका में लिखने का भी प्रयास कर रहा था। अब, मुझे शोध करना है कि यह सब क्या था! :) इस बारे में सीखते हुए, मैं अन्य लोगों को apparmor (और इसलिए, कमांड आ-स्टेटस) के बारे में पढ़ने की सलाह देता हूं: en.wikipedia.org/wiki/AppArmor
डेविड एल

1
मेरे मामले में इसने मदद की: /your/abs/folder/ r, /your/abs/folder/** rwk, }अंत में अल्पविराम को शामिल करना न भूलें!
ACV

1
यह / tmp में लिखने के लिए काम करता है। इसके बजाय खिड़कियों का उपयोग करें। लिनक्स बेकार है
विक्टर Ionescu

17

उबंटू AppArmor का उपयोग करता है और वह वह है जो आपको डेटा / एक्सेस करने से रोकता है। फेडोरा सेलिनक्स का उपयोग करता है और यह एक आरएचईएल / फेडोरा / सेंटोस मशीन पर रोक देगा।

MySQL का उपयोग करने / डेटा का पालन करने की अनुमति देने के लिए AppArmor को संशोधित करने के लिए:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

निर्देशिका की सूची में कहीं भी इस पंक्ति को जोड़ें:

/data/ rw,

तो एक करो:

sudo /etc/init.d/apparmor restart

एक अन्य विकल्प यह है कि MyAql के लिए AppArmor को पूरी तरह से निष्क्रिय कर दिया जाए, यह जरूरी नहीं है :

sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

प्रशिक्षक को पुनः आरंभ करना न भूलें:

sudo /etc/init.d/apparmor restart


वास्तव में mysql के लिए अप्पमोर को निष्क्रिय करने के लिए मुझे करना चाहिए: cyberciti.biz/faq/ubuntu-linux-howto-disable-apparmor-commands
silver_mx

14

मुझे पता है कि आपने कहा था कि आपने पहले ही 777 के लिए अनुमतियां सेट करने की कोशिश की थी, लेकिन जैसा कि मेरे पास एक सबूत है कि मेरे लिए यह एक अनुमति मुद्दा था जिसे मैं पोस्ट कर रहा हूं जो मैं उम्मीद कर रहा हूं कि यह मदद कर सकता है। यहाँ मेरा अनुभव है:

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

me @ server: / data $ pwd / data me @ server: / data $ ls -al कुल 60 ... drwxrwxrwx 2 mysql mysql 4096 2010-05-06 16:27 dumptest me इस सर्वर: / डेटा $ mysqldump -u dbuser -p -T dumptest -B db_name --tables test पासवर्ड दर्ज करें: mysqldump: Got error: 1: फ़ाइल का निर्माण / लिखने के लिए '/data/dumptest/test.txt' (इरोडकोड: 13) का चयन नहीं कर सकते हैं जब 'SELECT INTO' निष्पादित करते हैं। OUTFILE 'me @ सर्वर: / डेटा $ sudo chmod a + rwx dumptest / me @ सर्वर: / data $ mysqldump -u dbuser -p -T dumptest -B db_name-tables परीक्षण पासवर्ड दर्ज करें: mysqldump: Got error: 1: (() वही त्रुटि)
रयान ओल्सन

ओए, ठीक है, एहसास नहीं था कि टिप्पणी प्रारूप नहीं होगी, लेकिन डबल ने कुछ अलग तरीके की जाँच की। पहले mysql के स्वामित्व वाली लक्ष्य निर्देशिका के साथ: mysql, फिर उपयोगकर्ता द्वारा स्वामित्व वाली लक्ष्य निर्देशिका के साथ मैं डंप कमांड चला रहा था, दोनों तरीके अभी भी मुझे एक ही अनुमति त्रुटि देते हैं।
रयान ओल्सन

रिकॉर्ड के लिए, इसने मेरे लिए काम किया, भले ही एपर्मर अनुमतियाँ बदल दीं
एलेक्स

मैंने एपर्मर में संशोधन करने की कोशिश की, यह काम नहीं किया। अनुमति बदलना 'चामोद 777' ने मेरे लिए काम किया!
सुदर्शन_एसएमडी

7

MySQL यहाँ बेवकूफ हो रही है। यह / tmp / data / .... के तहत फाइल बनाने की कोशिश करता है। तो आप जो कर सकते हैं वह निम्नलिखित है:

mkdir /tmp/data
mount --bind /data /tmp/data

फिर अपनी क्वेरी का प्रयास करें। इस मुद्दे पर डिबगिंग के घंटे के बाद मेरे लिए काम किया।


मुझे यह उत्तर सबसे अच्छा लगा। यह आसान है, यह काम करता है, और इसके लिए आपको ऐपर्मर के साथ फ्यूजनिंग की आवश्यकता नहीं होती है। पाइपों का उपयोग करने का दूसरा तरीका बड़े निर्यात के लिए अच्छी तरह से काम नहीं करता है क्योंकि सभी बफरिंग की जाती है।
क्रिस सेलीन

6

यह समस्या लंबे समय से मुझे परेशान कर रही है। मैंने देखा कि यह चर्चा RHEL / Fecora पर समाधान को इंगित नहीं करती है। मैं आरएचईएल का उपयोग कर रहा हूं और मुझे उबंटू पर AppArmer के अनुरूप कॉन्फ़िगरेशन फाइलें नहीं मिलती हैं, लेकिन मैंने निर्देशिका में हर निर्देशिका को पठनीय और पठनीय द्वारा सुलभ बनाकर मेरी समस्या हल कर दी। उदाहरण के लिए, यदि आप एक निर्देशिका / tmp बनाते हैं, तो निम्न दो कमांड SELECT INTO OUTFILE को .sql और .sql फ़ाइल को आउटपुट करने में सक्षम बनाते हैं।

chown mysql:mysql /tmp
chmod a+rx /tmp

यदि आप अपने होम डायरेक्टरी / होम / टॉम में एक डायरेक्टरी बनाते हैं, तो आपको यह दोनों / होम और / होम / टॉम दोनों के लिए करना होगा।


3
एक उदाहरण के रूप में / tmp का उपयोग करना एक अच्छा विचार नहीं है, और आप वास्तव में / tmp निर्देशिका के स्वामित्व को बदलना नहीं चाहते हैं (ज्यादातर मामलों में)।
sastorsl

/ Tmp का स्वामित्व बदलना बुरा है, लेकिन / tmp के अंदर एक अस्थायी फ़ोल्डर बनाना और chown mysql:mysqlमेरी समस्या हल कर दी
Samuel Prevost

6

तुम यह केर सकते हो :

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

धन्यवाद! क्या सीएसवी के रूप में आउटपुट को नियंत्रित करना संभव है?
हैम्मन सैमुअल

4

कोशिश करने के लिए कुछ बातें:

  • है secure_file_privप्रणाली चर सेट? यदि ऐसा है, तो सभी फाइलों को उस निर्देशिका में लिखा जाना चाहिए।
  • सुनिश्चित करें कि फ़ाइल मौजूद नहीं है - MySQL केवल नई फाइलें बनाएगा, मौजूदा लोगों को अधिलेखित नहीं करेगा।

1
मैं Secure_file_priv के लिए भी जाऊंगा। यदि फ़ाइल पहले से मौजूद है, तो त्रुटि संदेश अलग है (इरोड 13 नहीं)।
जेवियर माइलार्ड

safe_file_priv वर्तमान में सेट नहीं है, इसलिए जैसा कि मैं इसे समझता हूं इसका मतलब है कि मुझे उस जगह तक सीमित नहीं होना चाहिए जहां मैं फाइलें लिख सकता हूं। क्या मुझे यह गलतफहमी है कि क्या मुझे फाइल सिस्टम पर कहीं भी लिखने में सक्षम होने के लिए इसे स्पष्ट रूप से '/' की तरह सेट करना होगा?
रयान ओल्सन

इसके अलावा, मैं जाँच कर रहा हूँ कि क्वेरी चलाने से पहले फ़ाइल मौजूद नहीं है।
रयान ओल्सन

प्रतिक्रिया के लिए धन्यवाद। आपके निष्कर्षों के आधार पर, मुझे नहीं लगता कि इन सुझावों में से कोई भी आपकी समस्या का कारण बनता है।
mdma

3

मुझे एक ही समस्या है और मैंने निम्न चरणों का पालन करके इस समस्या को ठीक किया:

  • ऑपरेटिंग सिस्टम: ubuntu 12.04
  • दीपक लगाया
  • मान लीजिए कि आउटपुट फ़ाइल सहेजने के लिए आपकी निर्देशिका है: / var / www / csv /

टर्मिनल पर कमांड का पालन करें और आउटपुट फ़ाइल में अपनी निर्देशिका जोड़ने के लिए gedit एडिटर का उपयोग करके इस फ़ाइल को संपादित करें।

सुडो गेडिट /etc/apparmor.d/usr.sbin.mysqld

  • अब फ़ाइल संपादक में खोली जाएगी कृपया अपनी निर्देशिका वहां जोड़ें

    / var / www / सीएसवी / * आरडब्ल्यू,

  • इसी तरह मैंने अपनी फ़ाइल में, दी गई छवि के अनुसार जोड़ा है:

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

सेवाओं को पुनः आरंभ करने के लिए अगला आदेश निष्पादित करें:

sudo /etc/init.d/apparmor पुनरारंभ

उदाहरण के लिए, मैं csv फ़ाइल में आउटपुट डेटा के लिए phpmyadmin क्वेरी बिल्डर में क्वेरी का पालन करता हूं

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

यह सफलतापूर्वक किया और OUTPUT.csv फ़ाइल में चयनित कॉलम के साथ सभी पंक्तियों को लिखें ...


2

मेरे मामले में, समाधान को निर्देशिका पथ में प्रत्येक निर्देशिका को पठनीय और सुलभ बनाना था mysql( chmod a+rx)। निर्देशिका अभी भी कमांड लाइन में अपने सापेक्ष पथ द्वारा निर्दिष्ट की गई थी।

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

2

मैं बस इसी समस्या में भाग गया। मेरी समस्या यह थी कि जिस निर्देशिका में मैं डंप करने की कोशिश कर रहा था, उसमें मायस्कल्ड प्रक्रिया की अनुमति नहीं थी। प्रारंभिक एसक्यूएल डंप बाहर लिखना होगा लेकिन सीएसवी / टीएक्सटी फ़ाइल का लेखन विफल हो जाएगा। ऐसा लगता है कि मौजूदा उपयोगकर्ता के रूप में sql डंप चलता है और csv / txt में रूपांतरण उस उपयोगकर्ता के रूप में चलाया जाता है जो myqqld चला रहा है। इसलिए निर्देशिका को दोनों उपयोगकर्ताओं के लिए लिखने की अनुमति चाहिए।


1

आपको एक पूर्ण पथ प्रदान करने की आवश्यकता है, सापेक्ष पथ नहीं।

उस डेटा निर्देशिका को पूरा पथ प्रदान करें जिसे आप लिखने की कोशिश कर रहे हैं।


वह मेरे लिए एक निरपेक्ष मार्ग की तरह दिखता है। क्या ऐसा नहीं है?
पेक्का

2
यह सत्यापित करने के लिए mysql उपयोगकर्ता के रूप में प्रयास करें कि आप mysql के बाहर फ़ाइल बना सकते हैं:touch /data/outfile.csv
Ike वाकर

1
पहले मैं ऐसा नहीं कर सका क्योंकि mysql उपयोगकर्ता का शेल / bin / false पर सेट किया गया था, इसलिए मैं mysql के रूप में लॉग इन नहीं कर सका। बस यह सुनिश्चित करने के लिए कि समस्या में योगदान नहीं कर रहा था, मैंने mysql के शेल को / bin / bash पर सेट किया, उस उपयोगकर्ता को su'd और एक फाइल को / data में टच किया। फ़ाइल को सफलतापूर्वक बनाया गया, जिसके पास mysql का स्वामित्व था।
रयान ओल्सन

3
भले ही यह "अक्षम" गोले में से एक का उपयोग कर रहा हो, आप खाते पर मुकदमा कर सकते हैं: su --shell=/bin/sh nameofaccount
मार्क बी

धन्यवाद, मुझे इसकी जानकारी नहीं थी।
रयान ओल्सन

1

क्या उबंटू SELinux का उपयोग करता है? यह देखने के लिए जांचें कि क्या यह सक्षम और लागू है। /var/log/audit/audit.log helpul हो सकता है (यदि उबंटू ने इसे चिपका दिया है - तो यह RHEL / फेडोरा स्थान है)।


0

मुझे एक CentOs पर यही समस्या थी। 6.7 मेरे मामले में सभी अनुमतियाँ सेट थीं और अभी भी त्रुटि हुई थी। समस्या यह थी कि एसई लिनक्स "एनफोर्सिंग" मोड में था।

मैंने इसे कमांड का उपयोग करके "अनुमति" पर स्विच किया sudo setenforce 0

फिर मेरे लिए सब कुछ काम कर गया।

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