2012-06-03 21 views
24

मैं एक सिंगल लाइन कमांड लिख रहा हूं जो सभी डेटाबेस को अपने संबंधित नामों में बैकअप करता है, बजाय सभी को एक वर्ग में डंपिंग का उपयोग करके बैकअप करता है।mysqldump एक अलग फ़ाइल में डीबी के साथ

उदाहरण के लिए: DB1 db1.sql को सहेज और डीबी 2 अब तक

db2.sql को सहेजा जाता है, मैं निम्न कमांड सभी डेटाबेस को पुनः प्राप्त करने के लिए एकत्र हुए थे।

mysql -uuname -ppwd -e 'show databases' | grep -v 'Database' 

मैं awk साथ पाइप की योजना बना रहा हूँ यह कैसा

awk '{mysqldump -uuname -ppwd $1 > $1.sql}' 

कुछ करने के लिए लेकिन यह काम नहीं करता।

मैं बैश करने के लिए नया हूं, इसलिए मैं अपनी सोच में गलत हो सकता था।
इसे डीबी को अपने संबंधित नामों में निर्यात करने के लिए मुझे क्या करना चाहिए?

अद्यतन:
ठीक है, अंततः इसे नीचे दिए गए संकेतों से काम करने में कामयाब होना है।
इस अंतिम स्क्रिप्ट

# replace [] with your own config 
# replace own dir to save 
# echo doesn't work. hmm... 

mysql -u[uname] -p'[pwd]' -e "show databases" \ 
| grep -Ev 'Database|information_schema' \ 
| while read dbname; \ 
do \ 
echo 'Dumping $dbname' \ 
mysqldump -u[uanme] -p'[pwd]' $dbname > ~/db_backup/$dbname.sql;\ 
done 

की हालांकि काम नहीं करता गूंज हिस्सा है।

+0

क्योंकि यह ~/db_backup/$ dbname.sql में पुनः निर्देशित किया जाता गूंज काम नहीं करता है के लिए काम किया है। आपका mysqldump भी काम नहीं कर रहा है - जिस तरह से यह लिखा गया है, यह सिर्फ गूंज के लिए एक तर्क है। मैं पुनर्निर्देशित करने के बजाय mysqldump --result-file तर्क का उपयोग करने की अनुशंसा करता हूं, बस यह स्पष्ट करने के लिए कि क्या हो रहा है। –

+0

कम से कम आपको ";" जोड़ना होगा गूंजने के बाद 'डबिंग $ dbname' – Nadir

उत्तर

0

अपने प्रश्न का उत्तर नहीं है, लेकिन पहिया को पुन: आविष्कार करने के बजाय, Sourceforge पर AutoMySQLBackup प्रोजेक्ट पर नज़र डालें। यह वही करता है जो आप चाहते हैं, और संपीड़न, एन्क्रिप्शन, रोटेशन और ईमेल अधिसूचनाओं सहित शीर्ष पर अतिरिक्त सुविधाओं का एक टन प्रदान करता है। मैंने इसे थोड़ी देर पहले इस्तेमाल किया और यह वास्तव में अच्छी तरह से काम किया।

0

यह ठीक प्रतीत होता है। इस समय मुझे केवल एक ही चीज़ मिल सकती है (बिना परीक्षण के) यह है कि के बाद आप अर्धविराम खो रहे हैं टेबल्स दिखाएं।

35
mysql -uroot -e 'show databases' | while read dbname; do mysqldump -uroot --complete-insert --some-other-options "$dbname" > "$dbname".sql; done 
+7

'myNql' को' -N' पास करने से कॉलम हेडर 'डेटाबेस' को छोड़ दिया जाएगा। –

+0

धन्यवाद Vinicius। मुझे "mysqldump मिल रहा था: त्रुटि मिली: 1049: डेटाबेस का चयन करते समय अज्ञात डेटाबेस 'डेटाबेस'" और क्यों काम नहीं कर सका। – Phil

0

जबकि AutoMySQLBackup परियोजना @Jeshurun ​​द्वारा सुझाए गए के लिए उपलब्ध पैकेज की खोज मैं Holland करवाते आ गया।

नाम से चिंतित (मैं बेल्जियम में नीदरलैंड के दक्षिण में रहता हूं, कभी-कभी या बेहतर कुछ हिस्सों - जिन्हें "हॉलैंड" कहा जाता है), मैंने इसे जांचने का फैसला किया। शायद यह आपकी मदद भी कर सकता है।

16

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

oneliner हम बैकअप के लिए हमारी mysql डेटाबेस बनाया है:

mysql -s -r -u bupuser -pSecret -e 'show databases' | while read db; do mysqldump -u bupuser -pSecret $db -r /var/db-bup/${db}.sql; [[ $? -eq 0 ]] && gzip /var/db-bup/${db}.sql; done 

बेस्ट passsword 'गुप्त' के साथ एक नया केवल पढ़ने के लिए mysql उपयोगकर्ता bupuser 'बनाने के लिए (बदल!)। यह पहले डेटाबेस की सूची पुनर्प्राप्त करेगा। फिर लूप और प्रत्येक डेटाबेस के लिए एक dump.sql फ़ाइल/var/db-bup (आप बदल सकते हैं) बनाते हैं। और केवल तभी जब कोई त्रुटि नहीं आती है तो फ़ाइल को भी gzip करें जो वास्तव में भंडारण को बहुत अधिक बचाएगा। जब कुछ डेटाबेस त्रुटियों का सामना करते हैं तो आप .sql फ़ाइल देखेंगे, न कि .sql.qz फ़ाइल।

+0

वास्तव में बहुत अच्छा है! – Mike

+0

यह लगभग सही था - चलो सिस्टम टेबल से बचने के लिए एक जीआरईपी जोड़ें: mysql -s -r -u root -proot -e 'डेटाबेस दिखाएं' | grep -Ev 'डेटाबेस | mysql | info_schema | phpmyadmin' | जबकि डीबी पढ़ा; mysqldump -u root -proot $ db -r /var/www/html/${db}.sql करें; [[$? -eq 0]] && gzip /var/www/html/${db}.sql; किया – Nadir

+1

** यह मेरा आखिरी संस्करण ** है: mysql -s -r -u root -proot -e 'डेटाबेस दिखाएं' | grep -Ev 'डेटाबेस | info_schema | performance_schema | phpmyadmin' | grep -v '^ mysql $' | जबकि डीबी पढ़ा; mysqldump -u root -proot $ db | gzip> /var/dump/${db}.sql.gz करें; किया – Nadir

8

यहाँ एक आसान स्क्रिप्ट होगा:

  • डंप सभी डीबी एक संपीड़ित उत्पादन ->SCHEMA_NAME.sql.gz
  • उपयोग [autocommit/unique_checks/foreign_key_checks]
  • आयात तेजी लाने के लिए डिफ़ॉल्ट स्कीमा को बाहर

फ़ाइल: Dump_all.sh

उपयोग कैसे करें:
./Dump_all.sh -> सभी डीबी
./Dump_all.sh SCHEMA_NAME डंप हो जाएगा -> SCHEMA_NAME डीबी

#!/bin/bash 
MYSQL_USER="root" 
MYSQL_PASS="YOUR_PASS" 

echo "-- START --" 

echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > tmp_sqlhead.sql 
echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;" > tmp_sqlend.sql 

if [ -z "$1" ] 
    then 
    echo "-- Dumping all DB ..." 
    for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
    do 
     if [ "$I" = information_schema ] || [ "$I" = mysql ] || [ "$I" = phpmyadmin ] || [ "$I" = performance_schema ] # exclude this DB 
     then 
     echo "-- Skip $I ..." 
     continue 
     fi 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
    done 

else 
     I=$1; 
     echo "-- Dumping $I ..." 
     # Pipe compress and concat the head/end with the stoutput of mysqlump ('-' cat argument) 
     mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I | cat tmp_sqlhead.sql - tmp_sqlend.sql | gzip -fc > "$I.sql.gz" 
fi 

# remove tmp files 
rm tmp_sqlhead.sql 
rm tmp_sqlend.sql 

echo "-- FINISH --" 
0

डंप हो जाएगा यह है कि मैं क्या उपयोग कर रहा हूँ, यह बहुत आसान है और मेरे लिए ठीक काम करता है।

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname"> "$(date +%Y%m%d)-$dbname".sql; done

संपीड़न विकल्प के साथ

:

mysql --skip-column-names -u root -p -e 'show databases' | while read dbname; do mysqldump --lock-all-tables -u root -p "$dbname" | gzip> /tmp/"$(date +%Y%m%d)-$dbname".sql.gz; done

आप आदेश में पासवर्ड जोड़ नहीं था, तो आप लिखने की आवश्यकता एक प्लस डेटाबेस आपके पास की कुल संख्या।

1

यहाँ क्या मुझे

mysql -s -r -uroot -e 'show databases' -N | while read dbname; do 
    mysqldump -uroot --complete-insert --single-transaction "$dbname" > "$dbname".sql; 
done