कमांड लाइन से एक सादे डेटाबेस (CSV) बैकअप के लिए एक mysql डेटाबेस को डंप करें


92

मैं mysqldump से बचना चाहूंगा क्योंकि यह एक ऐसे रूप में आउटपुट है जो केवल पढ़ने के लिए mysql के लिए सुविधाजनक है। CSV अधिक सार्वभौमिक लगता है (प्रति तालिका एक फ़ाइल ठीक है)। लेकिन अगर वहाँ mysqldump के लिए फायदे हैं, मैं सब कान हूँ। इसके अलावा, मुझे कुछ ऐसा चाहिए जो मैं कमांड लाइन (लिनक्स) से चला सकूं। यदि यह एक mysql स्क्रिप्ट है, तो इस तरह की बात करने के लिए संकेत देना सहायक होगा।


जवाबों:


140

यदि आप टेबल-ए-ए-टाइम के साथ सामना कर सकते हैं, और आपका डेटा बाइनरी नहीं है, -Bतो mysqlकमांड के विकल्प का उपयोग करें । इस विकल्प के साथ यह TSV (टैब अलग) फाइलें उत्पन्न करेगा जो एक्सेल आदि में आयात कर सकते हैं, काफी आसानी से:

% echo 'SELECT * FROM table' | mysql -B -uxxx -pyyy database

वैकल्पिक रूप से, यदि आपको सर्वर की फाइल सिस्टम तक सीधी पहुँच मिली है, तो SELECT INTO OUTFILEवास्तविक CSV फ़ाइलों का उपयोग कर सकते हैं:

SELECT * INTO OUTFILE 'table.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    LINES TERMINATED BY '\n'
FROM table

धन्यवाद! आपका दूसरा "टेबल" "डेटाबेस" होना चाहिए, है ना? टीएसवी के बजाय सीएसवी के लिए कोई विकल्प नहीं जिसे आप जानते हैं?
dreeves

duh - हाँ, इसे 'डेटाबेस' पढ़ना चाहिए। नहीं, CSV के लिए कोई विकल्प नहीं है, यह सबसे अच्छा है जिसे मैं MySQL के अंतर्निहित 'सेलेक्ट इन आउटफाइल' का उपयोग किए बिना जानता हूं, जो CSV कर सकता है, लेकिन सर्वर पर फाइलें लिखता है, क्लाइंट नहीं।
अलनीतक

आउटपुट फ़ाइल पर ओवरराइट करने के लिए कैसे बाध्य करें?
जेसीएम

11
ध्यान दें कि जब एक रिश्तेदार पथ (या बस एक फ़ाइल नाम) दिया जाता है, तो फ़ाइल आपकी MYSQL निर्देशिका में दिखाई देगी, न कि आपकी वर्तमान शेल निर्देशिका (यानी जहां से \. file.sqlपढ़ती है)। जैसे, आपके इंस्टॉल पर निर्भर करता है कि आप इसे शायद/var/lib/mysql/[db_name]/table.csv
माला

32

MySQL में, आप CSV आउटपुट को निर्दिष्ट कर सकते हैं:

SELECT order_id,product_name,qty
FROM orders
INTO OUTFILE '/tmp/orders.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'

से http://www.tech-recipes.com/rx/1475/save-mysql-query-results-into-a-text-or-csv-file/


2
मुझे लगता है मैं निर्दिष्ट निर्देशिका पर डंप फ़ाइल को खोजने के लिए नहीं कर सकता, ऐसा क्यों है?
जेसीएम

@JCm यह सर्वर पर डंप करता है
Alnitak

26

आप mysqldump's --tabविकल्प के साथ एक बार में एक पूरा डेटाबेस डंप कर सकते हैं । आप एक निर्देशिका पथ की आपूर्ति और यह एक बनाता है .sqlके साथ फ़ाइल CREATE TABLE DROP IF EXISTSवाक्य रचना और एक .txtसामग्री के साथ फ़ाइल, टैब अलग कर दिया। कॉमा से अलग की गई फ़ाइलों को बनाने के लिए आप निम्नलिखित का उपयोग कर सकते हैं:

mysqldump --password  --fields-optionally-enclosed-by='"' --fields-terminated-by=',' --tab /tmp/path_to_dump/ database_name

उस पथ को mysql उपयोगकर्ता और कमांड चलाने वाले उपयोगकर्ता दोनों के द्वारा लिखने योग्य होना चाहिए, इसलिए सादगी के लिए मैं chmod 777 /tmp/path_to_dump/पहले सलाह देता हूं ।


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

mysqldump: You must use option --tab with --fields-...
मार्को

जड़ के रूप में: GRANT FILE ON *.* TO 'user1'@'localhost';- stackoverflow.com/a/15014385/1707015 । मेरे मामले में मुझे /var/lib/mysql-files/(इसके बजाय /tmp/) लेना था , उपयोगकर्ता को mysql पर सेट करें: mysql और 777 - stackoverflow.com/a/32737616/1707015 पर अधिकार सेट करें ।
qräbnö

18

संगठन विकल्प का चयन मेरे लिए काम नहीं करेगा लेकिन SED के माध्यम से टैब-सीमांकित फ़ाइल को पाइप करने के चक्कर के नीचे का तरीका:

mysql -uusername -ppassword -e "SELECT * from tablename" dbname | sed 's/\t/","/g;s/^/"/;s/$/"/' > /path/to/file/filename.csv

1
इस आदेश के परिणामस्वरूप पत्र को आउटपुट फ़ाइल में tबदल दिया गया ", "। ठीक वैसा नहीं जैसा मैं था।
ब्रेननआर

9

यहाँ इसके लिए सबसे सरल कमांड है

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' | sed  's/\t/,/g' > output.csv

यदि स्तंभ मान में कोई अल्पविराम है तो हम निम्न आदेश के साथ .csv के बजाय .tsv उत्पन्न कर सकते हैं

mysql -h<hostname> -u<username> -p<password> -e 'select * from databaseName.tableNaame' > output.csv

CSV के लिए: यह वह जगह काम करता है जहाँ मुझे सिर्फ अल्पविराम की आवश्यकता होती है। mysql -hlocalhost -uroot -e 'select * from databaseName.tableNaame' | sed 's/\t/,/g' > /tmp/output.csv`

3

यदि आपको वास्तव में "बैकअप" की आवश्यकता है, तो आपको डेटाबेस स्कीमा की भी आवश्यकता है, जैसे तालिका परिभाषाएं, परिभाषाएं देखें, स्टोर प्रक्रियाएं और इसी तरह। डेटाबेस का बैकअप केवल डेटा नहीं है।

बैकअप के लिए mysqldump प्रारूप का मूल्य विशेष रूप से यह है कि mysql डेटाबेस को पुनर्स्थापित करने के लिए इसका उपयोग करना बहुत आसान है। एक बैकअप जिसे आसानी से बहाल नहीं किया जाता है वह कहीं कम उपयोगी है। यदि आप किसी ऐसे तरीके की तलाश कर रहे हैं जिससे आप mysql डेटा का बैकअप ले सकें तो आप एक mysql सर्वर को पुनर्स्थापित कर सकते हैं तो मुझे लगता है कि आपको mysqldump टूल के साथ रहना चाहिए।

मायसक्ल फ्री है और कई अलग-अलग प्लेटफॉर्म पर चलती है। एक नया mysql सर्वर सेट करना जिसे मैं पुनर्स्थापित कर सकता हूं वह सरल है। मैं बिल्कुल भी चिंतित नहीं हूं कि मैं अपने आप को सेटअप करने में सक्षम नहीं हूं, इसलिए मैं एक पुनर्स्थापना कर सकता हूं।

मैं कस्टम बैकअप के बारे में अधिक चिंतित होगा / सीएसवी / tsv असफल जैसे एक नाजुक प्रारूप के आधार पर पुनर्स्थापित करें। क्या आप सुनिश्चित हैं कि आपके डेटा में मौजूद आपके सभी उद्धरण, अल्पविराम, या टैब सही ढंग से बच गए हैं और फिर आपके पुनर्स्थापना उपकरण द्वारा सही ढंग से पार्स किए गए हैं?

यदि आप डेटा निकालने के लिए एक विधि की तलाश कर रहे हैं तो अन्य उत्तरों में कई देखें।


धन्यवाद, बहुत मददगार! आपने मुझे मना लिया। मैं एक कमांड लाइन कमांड के माध्यम से एक सीएसवी डंप प्राप्त करने के लिए एक त्वरित तरीका चाहते हैं, हालांकि अन्य कारण हैं। मैं उस के लिए "स्वीकार किए जाते हैं जवाब" के लिए पकड़ रहा हूँ। (यद्यपि मैं शायद इस बिंदु पर वर्तमान उत्तरों से इसे एक साथ जोड़ सकता हूं, मुझे लगता है कि w / एक mysql स्क्रिप्ट है)।
dreeves

मैं मूल विधि का उपयोग करके दोनों बैकअप रखने में बहुत सारे मूल्य देख सकता हूं और अन्य प्रयोजनों के लिए भी अर्क कर सकता हूं।
ज़ॉडेचेचे

एमके-समानांतर-पुनर्स्थापना एक सीएसवी बैकअप को एमके-समानांतर डंप के साथ बहाल कर सकता है, जिससे आप दोनों दुनिया का सर्वश्रेष्ठ प्राप्त कर सकते हैं। वास्तव में, एमके-समानांतर-पुनर्स्थापना आपके द्वारा परिभाषित किसी भी ट्रिगर को सुनिश्चित करके एक बेहतर काम करता है।
पॉल डिक्सन

3

सीएसवी फ़ाइलों को आउटपुट प्राप्त करने के लिए आप स्क्रिप्ट का उपयोग कर सकते हैं। हेडर के साथ प्रति तालिका एक फ़ाइल।

for tn in `mysql --batch --skip-page --skip-column-name --raw -uuser -ppassword -e"show tables from mydb"`
do 
mysql -uuser -ppassword mydb -B -e "select * from \`$tn\`;" | sed 's/\t/","/g;s/^/"/;s/$/"/;s/\n//g' > $tn.csv
done

उपयोगकर्ता आपका उपयोगकर्ता नाम है, पासवर्ड पासवर्ड है यदि आप प्रत्येक तालिका के लिए पासवर्ड टाइप नहीं रखना चाहते हैं और mydb डेटाबेस का नाम है।

स्क्रिप्ट की व्याख्या: sed में पहली अभिव्यक्ति, टैब को "," के साथ प्रतिस्थापित करेगी, इसलिए आपके पास दोहरे कोट्स में संलग्न हैं और कॉमा द्वारा अलग किए गए हैं। दूसरा एक शुरुआत में डबल उद्धरण सम्मिलित करता है और तीसरा एक अंत में डबल उद्धरण सम्मिलित करता है। और अंतिम एक \ n का ख्याल रखता है।


यह ज्यादातर मुझे मिला जहां मुझे जाने की जरूरत थी, लेकिन आश्चर्य हुआ जब "टी" अक्षर को कॉमा से बदल दिया जा रहा था: stackoverflow.com/a/2610121/8400969
माइकल

और यह --skip-column-namesmysql के मेरे संस्करण में, साथ ही साथ कहना चाहिए
माइकल

2

की जाँच करें MK-समानांतर-डंप जो कभी उपयोगी का हिस्सा है उपकरणों की maatkit सूट । यह अल्पविराम से अलग फ़ाइलों को --csv विकल्प के साथ डंप कर सकता है।

यह आपके पूरे db को व्यक्तिगत तालिकाओं को निर्दिष्ट किए बिना कर सकता है, और आप एक बैकअपसेट टेबल में तालिकाओं के समूहों को निर्दिष्ट कर सकते हैं।

ध्यान दें कि यह अलग-अलग फ़ाइलों में तालिका परिभाषाओं, विचारों और ट्रिगर को भी डंप करता है। एक अधिक सार्वभौमिक रूप से सुलभ रूप में एक संपूर्ण बैकअप प्रदान करने के अलावा, यह तुरंत एमके-समानांतर-पुनर्स्थापना के साथ भी आरामदायक है


यह आदर्श बैकअप नहीं हो सकता है, लेकिन साझा करने के लिए पूरी तरह से कमाल है। धन्यवाद!
Atroon

maatkitलगता है percona toolkitअब का हिस्सा है , लेकिन मैं इसी उपकरण नहीं मिल सकता है।
sjas

1

दो लाइन पॉवरशेल उत्तर:

# Store in variable
$Global:csv = (mysql -uroot -p -hlocalhost -Ddatabase_name -B -e "SELECT * FROM some_table") `
| ConvertFrom-Csv -Delimiter "`t"

# Out to csv
$Global:csv | Export-Csv "C:\temp\file.csv" -NoTypeInformation

बूम-बाटा-बूम

-D = आपके डेटाबेस का नाम

-e = क्वेरी

-B = टैब-सीमांकित


1

यदि आप पूरे db को csv के रूप में डंप करना चाहते हैं

#!/bin/bash

host=hostname
uname=username
pass=password

port=portnr
db=db_name
s3_url=s3://bxb2-anl-analyzed-pue2/bxb_ump/db_dump/



DATE=`date +%Y%m%d`
rm -rf $DATE

echo 'show tables' | mysql -B -h${host} -u${uname} -p${pass} -P${port} ${db} > tables.txt
awk 'NR>1' tables.txt > tables_new.txt

while IFS= read -r line
do
  mkdir -p $DATE/$line
  echo "select * from $line" | mysql -B -h"${host}" -u"${uname}" -p"${pass}" -P"${port}" "${db}" > $DATE/$line/dump.tsv
done < tables_new.txt

touch $DATE/$DATE.fin


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