सभी डेटा InnoDB है
यह वह है जो आपको डेटा का सटीक पॉइंट-इन-टाइम स्नैपशॉट देगा:
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
--single-transaction
एक चेकपॉइंट का उत्पादन करता है जो डंप आने वाले परिवर्तनों को प्राप्त करते समय चेकपॉइंट से पहले सभी डेटा को कैप्चर करने की अनुमति देता है। आने वाले बदलाव डंप का हिस्सा नहीं बनते। यह सभी तालिकाओं के लिए समान बिंदु-समय सुनिश्चित करता है।
--routines
सभी संग्रहीत प्रक्रियाओं और संग्रहीत कार्यों को डंप करता है
--triggers
प्रत्येक तालिका के लिए सभी ट्रिगर डंप करता है जो उनके पास है
सभी डेटा MyISAM है या InnoDB / MyISAM का मिश्रण है
आपको एक वैश्विक रीड लॉक लगाना होगा, mysqldump का प्रदर्शन करना होगा, और वैश्विक लॉक को रिलीज़ करना होगा
mysql -uuser -ppass -Ae"FLUSH TABLES WITH READ LOCK; SELECT SLEEP(86400)" &
sleep 5
mysql -uuser -ppass -ANe"SHOW PROCESSLIST" | grep "SELECT SLEEP(86400)" > /tmp/proclist.txt
SLEEP_ID=`cat /tmp/proclist.txt | awk '{print $1}'`
echo "KILL ${SLEEP_ID};" > /tmp/kill_sleep.sql
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
mysql -uuser -ppass -A < /tmp/kill_sleep.sql
कोशिश करो !!!
UPDATE 2012-06-22 08:12 EDT
चूंकि आपके पास कुल डेटा का <50MB है, मेरे पास एक और विकल्प है। 86400 सेकंड (कि 24 घंटा) के लिए वैश्विक रीड लॉक को धारण करने के लिए पृष्ठभूमि में एक SLEEP कमांड लॉन्च करने के बजाय, केवल प्रक्रिया आईडी प्राप्त करने और बाहर मारने के लिए, आइए OS में के बजाय mysql में 5 सेकंड का समय निर्धारित करने का प्रयास करें:
SLEEP_TIMEOUT=5
SQLSTMT="FLUSH TABLES WITH READ LOCK; SELECT SLEEP(${SLEEP_TIMEOUT})"
mysql -uuser -ppass -Ae"${SQLSTMT}" &
mysqldump -uuser -ppass --single-transaction --routines --triggers --all-databases > backup_db.sql
यह बहुत छोटे डेटाबेस के लिए एक क्लीनर और सरल दृष्टिकोण है।