कैसे कुशलतापूर्वक एक विशाल MySQL innodb डेटाबेस डंप करने के लिए?


8

मुझे एक Ubuntu 10.04 उत्पादन मिला MySQL डेटाबेस सर्वर जहां डेटाबेस का कुल आकार 260 GB है जबकि रूट विभाजन का आकार 300 GB है जहाँ DB संग्रहीत है, अनिवार्य रूप से लगभग 96% का मतलब है / भरी हुई है और डंप / बैकअप भंडारण के लिए कोई जगह नहीं बची है आदि कोई अन्य डिस्क सर्वर से जुड़ी नहीं है।

मेरा कार्य विभिन्न डेटाबेस में बैठे अन्य डेटाबेस में इस डेटाबेस को माइग्रेट करना है। प्रश्न यह है कि न्यूनतम डाउनटाइम के साथ कुशलतापूर्वक कैसे किया जाए?

मैं लाइन में सोच रहा हूँ:

  • सर्वर पर एक अतिरिक्त ड्राइव संलग्न करने और उस ड्राइव में डंप लेने का अनुरोध करें। [संपादित करें: यह अब संभव नहीं है।]
  • डंप को नए सर्वर पर स्थानांतरित करें, इसे पुनर्स्थापित करें और डेटा को सिंक में रखने के लिए नए सर्वर को मौजूदा एक का दास बनाएं
  • जब माइग्रेशन की आवश्यकता होती है, तो प्रतिकृति को तोड़ दें, पढ़ने / लिखने के अनुरोधों को स्वीकार करने के लिए स्लेव कॉन्फिगरेशन को अपडेट करें और पुराने सर्वर को केवल पढ़ने के लिए बनाएं ताकि यह किसी भी लिखित अनुरोध का मनोरंजन न करे और ऐप डेवलपर्स को बताए कि डीबी के लिए नए आईपी पते के साथ कॉन्फिगर करने के लिए अपडेट किया जाए।

इसे बेहतर बनाने के लिए आपके सुझाव या इस कार्य के लिए कोई वैकल्पिक बेहतर तरीका क्या है?

जवाबों:


9

आप MySQL की सटीक एक ही संस्करण के साथ एक और डीबी सर्वर की ओर पलायन पर विचार कर रहे हैं, तो आप कर सकते हैं नए सर्वर पर पुराने सर्वर से।rsyncdatadir

यह InnoDB फ़ाइल लेआउट या यहां तक ​​कि MyISAM तालिकाओं की उपस्थिति की परवाह किए बिना काम करेगा।

  1. ServerA पर mysql का वही संस्करण स्थापित करें जो ServerA के पास है
  2. ServerA पर, RESET MASTER;rsycn प्रक्रिया से पहले सभी बाइनरी लॉग को मिटाने के लिए चलाएं। यदि बाइनरी लॉगिंग सक्षम नहीं है, तो आप इस चरण को छोड़ सकते हैं।
  3. ServerA पर, SET GLOBAL innodb_max_dirty_pages_pct = 0;mysql से और लगभग 10 मिनट चलाएं (यह InnoDB बफर पूल से गंदे पृष्ठों को शुद्ध करता है। यह mysql शटडाउन को तेज़ी से करने में भी मदद करता है) यदि आपका डेटाबेस सभी MyISAM है, तो आप इस चरण को छोड़ सकते हैं।
  4. rsync / var / lib / mysql ServerA के लिए / var / lib / mysql ServerB पर
  5. चरण 3 को तब तक दोहराएं जब तक कि rsync 1 मिनट से कम न हो जाए
  6. service mysql stop ServerA पर
  7. एक और rsync करें
  8. scp ServerA: /etc/my.cnf to ServerB: / etc /।
  9. service mysql start ServerB पर
  10. service mysql start ServerA (वैकल्पिक) पर

अनिवार्य रूप से, इस तरह की स्क्रिप्ट इस तरह की है

mysql -u... -p... -e"RESET MASTER;"
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
    X=`echo ${X}+1|bc`
    rsync -r * targetserver:/var/lib/mysql/.
    sleep 60
done
service mysql stop
rsync -r * targetserver:/var/lib/mysql/.
service mysql start

DBA StackExchange के एक साथी ने कहा कि मुझे FLUSH TABLES WITH READ LOCK;mysqlperformanceblog.com में कुछ के आधार पर दूर रहना चाहिए

मैंने पढ़ा है और सीखा है कि कैन के बीच में InnoDB तालिकाओं के खिलाफ चयन FLUSH TABLES WITH READ LOCK;अभी भी किसी तरह से लिखने की अनुमति दे सकता है। जैसा कि अरलुकिन ने टिप्पणी में कहा है , LVM FLUSH TABLES WITH READ LOCKInnoDB पर ठीक काम करेगा (अपनी टिप्पणी के लिए +1)।

सभी गैर-एलवीएम उपयोगकर्ताओं के लिए, आप उपयोग के लिए एक ऑल-मियम डेटाबेस के साथ ठीक हैं FLUSH TABLES WITH READ LOCK;। InnoDB के लिए, --single-tranactionmysqldumps में उपयोग करने के लिए छड़ी कृपया।


2
यही कारण है कि हम इसे करते हैं, जब हमें मैन्युअल रूप से मास्टर-दास सेटअप को सिंक करने की आवश्यकता होती है। वास्तव में अच्छा काम करता है। लेकिन हमारे नवीनतम सर्वरों पर हम LVM स्नैपशॉट का उपयोग कर रहे हैं, इसलिए हमें सर्वर को रोकने की आवश्यकता नहीं है। LVM- स्नैपशॉट करने से ठीक पहले हम "FLADH TABLES WITH READ LOCK" निष्पादित करते हैं, इसलिए फ़ाइलों को कॉपी करना ठीक है। यदि आप बैकअप उद्देश्य में सभी फ़ाइलों को कॉपी करना चाहते हैं तो lvm-स्नैपशॉट भी वास्तव में अच्छा है। इसलिए अपने नए सर्वर को LVM के साथ सेटअप करें, और स्नैपशॉट करने में सक्षम होने के लिए कुछ अतिरिक्त स्थान जोड़ें।
अरलुकिन

विस्तृत उत्तर के लिए धन्यवाद। क्या होगा अगर MySQL संस्करण अलग हैं? पुराने एक ubuntu 10.04 के साथ 5.1 है, जबकि नए में मैं डिफ़ॉल्ट 5.5 के साथ 12.04 का उपयोग करने के लिए तैयार हूं। ऐसे मामले में आप क्या सलाह देते हैं? अतिरिक्त ड्राइव को अटैच करना अब सवाल से बाहर है इसलिए डेटा को दूरस्थ रूप से भेजने की आवश्यकता है चाहे डंप / rsync या किसी अन्य तरीके से।
जगबीर

1

एक डंप और एक डेटाबेस को पुनर्स्थापित करना जो आकार में घंटे लगेंगे। मैं, संस्करण संख्या में वृद्धि के रूप में लंबे समय तक mysql के संस्करणों पर निर्भर करता हूं और प्रमुख संशोधन संख्या में कोई छलांग नहीं है। आपको कच्चे डेटाबेस की फ़ाइलों को / var / lib / mysql में ले जाना चाहिए और उन्हें नए सर्वर पर रखना चाहिए, अनुमतियों को सेट करना चाहिए और --skip-अनुदान-टेबल स्विच के साथ सर्वर को आग लगाना चाहिए। नए IP पते को दर्शाने वाले उपयोगकर्ताओं के लिए आवश्यक अनुदान जोड़ें फिर सामान्य रूप से पुनः आरंभ करें।

मैं आपके डेटाबेस के आकार को संबोधित करूंगा क्योंकि यह कुशल होना बहुत बड़ी बात है।


4 डेटाबेस हैं जिनका आकार लगभग 50-90 जीबी है जो समग्र आकार 260 जीबी बनाते हैं। यह कुशल हो सकता है, लेकिन मुझे इसके साथ रहना होगा। इसके अलावा MySQL संस्करण अलग हैं, आप उस मामले में क्या सुझाव देते हैं?
जगबीर

यदि mysql संस्करण अलग-अलग हैं तो पहले ड्राई रन करें और तब तक अच्छी तरह से परीक्षण करें जब तक कि नए सर्वर पर संस्करण संख्या पुराने की तुलना में अधिक हो, आपको ठीक होना चाहिए। यदि यह असफल है तो आप mysqldump && पुनर्स्थापित का उपयोग करके अटक सकते हैं।
जेम्स पार्क-वाट

1

इस विशाल InnoDB डेटाबेस को स्थानांतरित करने के लिए आप इन चरणों का पालन कर सकते हैं।

  • SSHFS स्थापित करें और उत्पादन सर्वर पर दूरस्थ सर्वर के प्रासंगिक विभाजन को माउंट करें
  • InnoDB डेटाबेस की हॉटकॉपी प्राप्त करने के लिए पेरकोना XtraBackup का उपयोग करें और इसे सीधे SSHFS निर्देशित निर्देशिका में सहेजें
  • इस कार्य में कई घंटे लगेंगे। लाइव सर्वर पर हॉटकॉपी स्क्रिप्ट के प्रभाव को कम करने के लिए, इस का उपयोग करते हुए कम प्राथमिकता निर्धारित करें

    $ renice -n 5 -p <SCRIPT-PID>

  • सुनिश्चित करें कि दोनों सर्वर MySQL सर्वर के एक ही रिलीज़ को चला रहे हैं।
  • एक बार हॉटकॉपी पूरी हो जाने के बाद, आप इसे पुन: शुरू कर सकते हैं नए सर्वर में प्रतिकृति प्रक्रिया शुरू कर सकते हैं

आप इस प्रक्रिया के दौरान सुस्ती का अनुभव कर सकते हैं, लेकिन निश्चित रूप से कोई डाउनटाइम नहीं। Percona XtraBackup एक हॉटकॉपी बनाएगी जो mysqldump की तुलना में जल्दी और कम संसाधन वाली होती है। यह एक विशाल InnoDB डेटाबेस के लिए आदर्श है।

उपयोग के पैटर्न और आँकड़ों के आधार पर, सर्वर पर न्यूनतम ट्रैफ़िक होने पर आप इस प्रक्रिया को चला सकते हैं। शायद सप्ताहांत में ऐसा करना एक अच्छा विचार है? उपरोक्त प्रक्रिया की एक रूपरेखा है। आपको Percona XtraBackup और SSHFS प्रलेखन से गुजरना पड़ सकता है।


1

आप डेटाबेस को सीधे दूरस्थ सर्वर पर डंप कर सकते हैं ...

$ mysqldump | ssh user@server 'cat - > dumpfile.sql.gz'

... एसक्यूएल को अच्छी तरह से संपीड़ित करना चाहिए ताकि आपको इनमें से किसी एक विकल्प के साथ बहुत तेज हो जाना चाहिए, हालांकि यह बॉक्स में आपके पास मौजूद रैम की मात्रा पर भी निर्भर करेगा ...

$ mysqldump | ssh -C user@server 'cat - > dumpfile.sql.gz'
$ mysqldump | gzip -c | ssh user@server 'cat - > dumpfile.sql.gz'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.