फाइल करने के लिए MySQL डेटा आउटपुट नहीं कर सकता


13

मैं MySQL तालिका से फ़ाइल में डेटा आउटपुट करने की कोशिश कर रहा हूं, लेकिन अनुमति त्रुटियां प्राप्त कर रहा हूं:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

यदि प्रश्न में निर्देशिका को 777 पर नामांकित किया गया है, तो MySQL उपयोगकर्ता फ़ाइल क्यों नहीं लिख सकता है? दिलचस्प बात यह है कि, मैं / tmp / या तो लिख नहीं सकता।

संपादित करें: ऐसा लगता है कि DB उपयोगकर्ता के पास उचित MySQL अनुमतियां हैं:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

2
आपको संपूर्ण निर्देशिका ट्री पर MySQL तक पहुँच अधिकार देना होगा। inयदि MySQL एक्सेस नहीं कर सकता है तो अधिकारों को प्रदान करना व्यर्थ है dotanchoen। दूसरे शब्दों में, बैंक वॉल्ट में सेफ्टी डिपो बॉक्स को व्यापक रूप से खुला छोड़ा जा सकता है, लेकिन यदि बैंक वॉल्ट का दरवाजा बंद है, तो आप बॉक्स में नहीं जा रहे हैं। आपके gsउपयोगकर्ता के पास FILEवास्तव में उस क्वेरी को निष्पादित करने के लिए mysql विशेषाधिकार होना चाहिए ।

समस्या यह है कि आपके पास चुनिंदा परमिट नहीं हो सकते हैं? Mysql अनुमतियाँ निर्देशिका अनुमतियों द्वारा नियंत्रित नहीं हैं। विशिष्ट mysql उपयोगकर्ता के रूप में चलाने के लिए आपको mysql -u <username> -p का उपयोग करना होगा। उपयोगकर्ता को db तक पहुँच प्रदान करने के लिए, MySql अनुदान देखें। dev.mysql.com/doc/refman/5.1/en/grant.html

धन्यवाद, इस उपयोगकर्ता के पास SELECTअनुमतियां हैं। मैं अक्सर इस उपयोगकर्ता के रूप में डेटाबेस ब्राउज़ करता हूं।
dotancohen

धन्यवाद, मार्क, यही मैं डरता था। इसलिए मेरे पास एक "इनबॉक्स" फ़ोल्डर नहीं हो सकता है, जिसे अन्य उपयोगकर्ता लिख ​​सकते हैं, बिना उन्हें पढ़ने के लिए / मेरे घर निर्देशिका में लिखने के लिए?
dotancohen

2
सुनिश्चित करें कि उपयोगकर्ता के पास MySQL डॉक्सFILE द्वारा वर्णित विशेषाधिकार हैं ।
माइक परसेल

जवाबों:


12

चयन पर MySQL प्रलेखन के अनुसार ... OUTFILE में

INTO OUTFILE या INTO DUMPFILE द्वारा बनाई गई कोई भी फ़ाइल सर्वर होस्ट पर सभी उपयोगकर्ताओं द्वारा लिखने योग्य है। इसका कारण यह है कि MySQL सर्वर एक ऐसी फ़ाइल नहीं बना सकता है जिसका स्वामित्व उपयोगकर्ता के अलावा किसी और के पास हो, जिसके खाते में यह चल रहा है। (आपको mysqld को कभी भी इसके और अन्य कारणों के लिए रूट के रूप में नहीं चलाना चाहिए।) फ़ाइल इस प्रकार विश्व-योग्य होनी चाहिए ताकि आप इसकी सामग्री में हेरफेर कर सकें।

आपको SELECT INTO OUTFILEनिम्नानुसार / var / lib / mysql पर आउटपुट देना चाहिए

SELECT * FROM data INTO OUTFILE 'data.csv';

बेशक, आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास gs @ localhost पर FILE की अनुमति है।

इस अनुमति के दो तरीके हैं

विधि # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

विधि # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

अद्यतन 2012-05-01 07:09 EDT

अपने आप को FILE विशेषाधिकार देने के लिए, निम्न कार्य करें:

  • कदम 01) service mysql restart --skip-networking --skip-grant-tables
  • कदम 02) mysql <hit enter>
  • कदम 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • कदम 04) exit
  • चरण 05) service mysql restart

धन्यवाद। मैंने के आउटपुट के साथ प्रश्न को अपडेट किया SHOW GRANTS। ऐसा लगता है कि DB उपयोगकर्ता के पास उचित अनुमतियाँ होनी चाहिए।
डॉटंचोहेन

DB उपयोगकर्ता के पास उचित अनुमति नहीं है। फ़ाइल विशेषाधिकार केवल GRANT ALL PRIVILEGES ON *.*जैसे RELOADऔर के साथ एक उपयोगकर्ता को दिया जाता है SHUTDOWN। ऐसा इसलिए है क्योंकि वे वैश्विक प्रशासनिक विशेषाधिकार हैं। GRANT ALLविशेषाधिकार आप के लिए है gsही डेटाबेस।
रोलैंडमाइसीडीडीबीए

1

विभिन्न वितरण और OSes सभी संभाल नहीं है स्थलों OUTFILEs उसी के लिए।

उदाहरण के लिए, जब लिनक्स पर mysqld डेमन चलाते हैं, जो सॉकेट का उपयोग करता है, तो OUTFILE कभी-कभी /tmpनिर्देशिका में लिखा जाता है । कोई बड़ी बात नहीं है, यह सिर्फ OUTFILE दृष्टिकोण का उपयोग कर कमियों है, अर्थात् अनुमतियों से निपटने और फ़ाइल कहाँ गई थी खोजने के लिए।

चूँकि इस प्रश्न का उद्देश्य विशेष रूप से "कैसे एक OUTFILE का उपयोग करें" नहीं है, लेकिन आप बस कुछ MySQL डेटा को एक फ़ाइल में कैप्चर करना चाहते हैं, यहाँ एक विकल्प है जिसे आपको FILE अनुमतियों के साथ घूमने की आवश्यकता नहीं है, आदि। ।

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

इसका आउटपुट डिफ़ॉल्ट रूप से टैब-सीमांकित है। अल्पविराम के लिए, बस इसे sedफ़ाइल में लिखने से पहले या कुछ के माध्यम से पाइप करें ।


1

मैंने इस पृष्ठ और स्टैकऑवरफ़्लो के कई अन्य पृष्ठों पर सुझावों को समझने की कोशिश करते हुए घंटों बिताए।

कोई फर्क नहीं पड़ता कि मैंने MySql में अनुमतियां कैसे बदल दीं, मुझे काम करने के लिए कुछ भी नहीं मिला।

मैं उन अनुमतियों पर वापस लौट आया, जिनके साथ मैंने शुरुआत की थी।

अंततः दूसरों के सुझावों की तुलना में मेरे लिए क्या काम आसान था:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
बैश सीएलआई पर उपयोग करने के लिए आपका तरीका अच्छा है। हालाँकि ओपी में सवाल यह है कि MySQL क्लाइंट CLI से किसी फ़ाइल में डेटा कैसे आउटपुट किया जाए।
डॉटनचेन

0

CSV को डेटा आउटपुट करने के लिए दो तरीकों के बारे में (जैसा कि वास्तव में TSV होना चाहिए), जैसा कि ऊपर उल्लेख किया गया है, मैंने पाया है कि अगर आपके द्वारा निर्यात की जा रही प्रविष्टियों में खाली मान हैं, तो एक जोखिम है कि डेटा को गलत तरीके से पेश करने के कारण गड़बड़ हो सकती है इसी कॉलम का डेटा।

रिकवरी के लिए डेटा अखंडता की चिंता के साथ, मुझे यह वेबसाइट मिली:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

इसने उस --xmlविकल्प का उल्लेख किया, mysqldumpजो XML प्रारूप में डेटा को निर्यात करने की अनुमति देता है, जिसे तब कस्टम स्क्रिप्ट द्वारा TSV सहित किसी भी प्रारूप में आवश्यक रूप से पार्स किया जा सकता है।

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