यदि आपके सभी डेटाबेस केवल InnoDB का उपयोग करते हैं, तो मेरे पास कुछ अच्छी खबरें हैं।
आपको एक गुलाम से समानांतर में सभी डेटाबेस को डंप करना चाहिए।
वास्तव में, आप सभी डेटाबेस को एक ही पॉइंट-इन-टाइम में बाध्य कर सकते हैं।
गुलाम के बारे में याद रखने वाली पहली बात यह है कि बाइनरी लॉगिंग को सक्षम करने की आवश्यकता नहीं है यदि यह अन्य दासों के लिए मास्टर नहीं है।
आप --master-data
समानांतर डंप के लिए विकल्प का उपयोग नहीं कर सकते क्योंकि प्रत्येक डंप में प्रत्येक डंप फ़ाइल की पंक्ति 22 पर एक अलग स्थिति होगी। मास्टर की अंतिम लॉग फ़ाइल को रिकॉर्ड करना और दास का उपयोग करके निष्पादित करना बेहतर है SHOW SLAVE STATUS\G
। इस तरह, सभी डेटाबेस में एक ही पॉइंट-इन-टाइम स्थिति होती है।
आप सभी डेटाबेस को एकत्र कर सकते हैं और सभी डेटाबेस के समानांतर डंप को स्क्रिप्ट कर सकते हैं।
DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}
for DB in `cat ${DBLIST}`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
mysql -h... -u... -p... -e"START SLAVE;"
यदि बस बहुत सारे डेटाबेस हैं, तो उन्हें 10 या 20 बार एक समय पर निम्नानुसार डंप करें:
DBLIST=/tmp/ListOfDatabasesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql','performance_schema')" > ${DBLIST}
COMMIT_LIMIT=20
COMMIT_COUNT=0
for DB in `cat ${DBLIST}`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
wait
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
mysql -h... -u... -p... -e"START SLAVE;"
यदि आपको एकल तालिका को पुनर्प्राप्त करने की आवश्यकता है, तो आप आकार क्रम में एक समय में डंप तालिकाओं 20 को समानांतर कर सकते हैं ।
इसे इस्तेमाल करे:
TBLIST=/tmp/ListOfTablesToParallelDump.txt
SSS=/tmp/ShowSlaveStatusDisplay.txt
BACKUP_BASE=/backups
BACKUP_DATE=`date +"%Y%m%d_%H%M%S"`
BACKUP_HOME=${BACKUP_BASE}/${BACKUP_DATE}
mkdir ${BACKUP_HOME}
cd ${BACKUP_HOME}
mysql -h... -u... -p... -e"STOP SLAVE;"
mysql -h... -u... -p... -e"SHOW SLAVE STATUS\G" > ${SSS}
LOGFIL=`cat ${SSS} | grep "Relay_Master_Log_File" | awk '{print $2}'`
LOGPOS=`cat ${SSS} | grep "Exec_Master_Log_Pos" | awk '{print $2}'`
echo "Master was at ${LOGFIL} Position ${LOGPOS} for this Backup" > Master_Log_FilePos.txt
mysql -h... -u... -p... -AN -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY data_length" > ${DBLIST}
COMMIT_LIMIT=20
COMMIT_COUNT=0
for DBTB in `cat ${TBLIST}`
do
DB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo "${DBTB}" | sed 's/\./ /g' | awk '{print $2}'`
DUMPFILE=$DB-{DB}-TBL-${TB}.sql.gz
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} ${TB} | gzip > ${DUMPFILE} &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
wait
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
mysql -h... -u... -p... -e"START SLAVE;"
अब जब आपके पास डेटाबेस या व्यक्तिगत तालिकाओं को डंप करने के लिए स्क्रिप्ट हैं, तो आप अपने विवेक पर उस डेटा को लोड कर सकते हैं। यदि आपको मास्टर पर बाइनरी लॉग से एसक्यूएल को निष्पादित करने की आवश्यकता है, तो आप इसका उपयोग कर सकते हैं mysqlbinlog
और इसे ओटी डेटाइम दे सकते हैं और एसक्यूएल को अन्य पाठ फ़ाइलों में आउटपुट कर सकते हैं। आपको बस उस डेटा की मात्रा का पता लगाने के लिए उचित परिश्रम करना होगा, जो आपके पास टाइमस्टैम्प्स में से कुछ भी होता है, जो कि bnary लॉग्स के पास है। बस याद रखें कि ओएस में हर बाइनरी लॉग का टाइमस्टैम्प प्रतिनिधित्व करता है कि पिछली बार यह लिखा गया था।