एक व्यस्त मास्टर-दास प्रतिकृति प्रणाली पर एकल mysql डेटाबेस को पुनर्प्राप्त करें


10

व्यस्त प्रतिकृति प्रणाली में किसी भी डेटाबेस को पॉइंट-इन-टाइम में पुनर्प्राप्त करने के लिए एक रणनीति या टूल की तलाश करना।

मेरे पास मास्टर-स्लेव प्रतिकृति कॉन्फ़िगरेशन में 2 MySQL 5.0.77 सर्वर पर 12 डेटाबेस चल रहे हैं। एक पूर्ण डंप दैनिक केवल पढ़ने के लिए गुलाम लिया जाता है, और वृद्धिशील SQL डंप उपलब्ध हैं, इन बैकअप ऑफ-साइट और प्रतिकृति स्थिति की निगरानी की जाती है।

संपादित करें: टेबल्स InnoDB और myISAM का मिश्रण हैं, इसलिए इंजन विशिष्ट समाधान उपलब्ध नहीं हैं।

इसलिए मास्टर सर्वर की पूरी तरह से विफलता, मैं प्रतिकृति को तोड़ सकता हूं और गुलाम सर्वर को बढ़ावा दे सकता हूं, मेरे पास एक नया सर्वर पुनर्निर्माण और फुल बैकअप से कॉन्फ़िगर करने का विकल्प भी है, और फिर दास से प्रति घंटा लिया गया अंतर लागू करें।

हालाँकि मैं चिंतित हूँ कि किसी एक डेटाबेस की आंशिक विफलता या विफलता से कैसे निपटूँ। मैं 2 परिदृश्यों के बारे में सोच सकता हूं जो काफी संभावना है;

  1. डेटाबेस 7 (उदाहरण के लिए) दूषित हो जाता है, कुछ अनुरोधों को तब तक जारी रखता है जब तक कोई नोटिस नहीं करता है कि यह टूट गया है, या लॉग फ़ाइलों से अलर्ट ...
  2. कुछ क्वेरी जैसे ड्रॉप डेटाबेस, ड्रॉप टेबल, "अपडेट कहां ..." क्वेरी किसी एकल डेटाबेस को टाइप करती है, या उसमें कुछ सबसेट।

फिलहाल मेरे पास FULL- $ DATE-all-database -sql.gz फ़ाइलों के रूप में एक फुल डंप है, और डिफॉल्ट के रूप में FULL डंप पर लागू किए जा सकने वाले अंतर- DATE-$-डेटाबेस -sql.gz

डेटाबेस 7 को कुछ बिंदुओं पर बहाल करने के लिए FULL और DIFF फ़ाइलों के माध्यम से एक grep की आवश्यकता होगी, और उस sql के मैनुअल एप्लिकेशन को।

मास्टर डेटाबेस में पिछले DIFF डंप में से किसी एक को पुनर्प्राप्त करने में सक्षम बनाने के लिए मुझे कैसे आगे बढ़ना चाहिए?

क्या मुझे व्यक्तिगत डेटाबेस फ़ाइलों के लिए बैकअप की आवश्यकता है, अर्थात

mysqldump --databases "database1" | gzip > database1.sql.gz
mysqldump --databases "database2" | gzip > database2.sql.gz
mysqldump --databases "database3" | gzip > database3.sql.gz

बजाय..

mysqldump --master-data --lock--all-databases --all-databases | gzip > all-databases.sql.gz

यदि मैं अलग mysqldump फ़ाइलों के लिए जाता हूं, तो मास्टर डेटा बाइनरी लॉग का क्या होता है, और क्या मुझे मास्टर सर्वर रिकवरी डंप के लिए भी सेटिंग - मास्टर डेटा होना चाहिए?

जवाबों:


7

यदि आपके सभी डेटाबेस केवल 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 लॉग्स के पास है। बस याद रखें कि ओएस में हर बाइनरी लॉग का टाइमस्टैम्प प्रतिनिधित्व करता है कि पिछली बार यह लिखा गया था।


शानदार जवाब। मुझे लगता है कि एक्सएफ़एस पर केवल-पढ़ने वाला दास होने से मुझे विकल्पों का भार मिलता है, और आपकी लिपियों ने वास्तव में मदद की है।
टॉम एच

उस परिदृश्य में जहां मुझे दास से बैकअप के लिए एक विशाल तालिका को पुनर्प्राप्त करने की आवश्यकता होती है। मुझे बस मास्टर पर तालिका का पुनर्निर्माण करना है, और सभी परिवर्तनों को गुलाम के लिए नीचे देना है, भले ही वह 20GB डेटा हो? क्या यह प्रक्रिया 1) अक्षम कीज़ होगी, 2) मास्टर पर तालिका को ड्रॉप करें और गुलाम 3) तालिका को पुनर्स्थापित करें मास्टर 4) कुंजी को सक्षम करें --- और क्या मास्टर ने सभी 20 जीबी को दास के नीचे दोहराया है?
टॉम एच

यदि ये डेटाबेस निर्दोष नहीं हैं, तो क्या मैं उन्हें अभी भी समानांतर में डंप कर सकता हूं?
टॉम एच

हां, यदि आप 1) डाउनटाइम शेड्यूल करते हैं, तो 2) रन service mysql restart --skip-networking, 3) समानांतर डंप, 4) रन करते हैं service mysql restart। फिर आपको आवश्यक तालिकाओं को फिर से लोड करें।
रोलैंडमाइसीडीडीबीए

संभवतया यदि पुनरारंभ का उद्देश्य डेटाबेस से नेटवर्क कनेक्शन लेखन को रोकना था, तो मैं iptables i.e. iptables -I INPUT -p tcp --dport 3306 -j DROPeth0 और लो
टॉम एच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.