2012-03-28 14 views
9

मैं अपने उत्पादन डेटाबेस को किसी अन्य सर्वर पर माइग्रेट करने जा रहा हूं। यह लगभग 38 जीबी बड़ा है और यह MYISAM टेबल का उपयोग कर रहा है। मेरे पास नई सर्वर फ़ाइल सिस्टम में कोई भौतिक पहुंच नहीं है, इसलिए हम केवल mysqldump का उपयोग कर सकते हैं।mysqldump लाइव उत्पादन में बाधा डाले बिना INSERT

मैंने इस साइट को देखा है और देखें कि mysqldump ऑनलाइन बैकअप हमारी उत्पादन वेबसाइट को नीचे लाएगा या नहीं। इस पोस्ट से: Run MySQLDump without Locking Tables, यह स्पष्ट रूप से कहता है कि mysqldump डीबी को लॉक करेगा और डालने से रोक देगा। लेकिन कुछ परीक्षणों के बाद, मैं यह जानकर उत्सुक हूं कि यह अन्यथा दिखाता है।

अगर मैं

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql 

mysqldump डिफ़ॉल्ट रूप से अंत में एक '--lock-टेबल' करना होगा उपयोग करते हैं, और यह एक पढ़ें स्थानीय ताले (refer to mysql 5.1 doc), वह जगह है जहाँ समवर्ती डालने अभी भी उपलब्ध। मैंने लूप को हर सेकेंड में एक टेबल में डालने के लिए किया है जबकि mysqldump को पूरा होने में एक मिनट लगते हैं। प्रत्येक अवधि में उस अवधि के दौरान रिकॉर्ड डाला जाएगा। जिसका मतलब है, mysqldump उत्पादन सर्वर को बाधित नहीं करेगा और INSERT अभी भी पर जा सकता है।

क्या कोई भी अलग अनुभव कर रहा है? मैं अपने उत्पादन सर्वर पर जाने से पहले यह सुनिश्चित करना चाहता हूं, इसलिए मुझे यह जानकर खुशी होगी कि मैंने कुछ गलत किया है जो मेरा परीक्षण गलत करता है।

[mysql सर्वर का मेरा संस्करण 5.1.52 है, और mysqldump 10.13 है]

+0

आपको माइग्रेशन को हल करने के लिए नए सर्वर ** FIRST ** तक पहुंच प्राप्त करनी चाहिए, और शायद MySQL प्रतिकृति को देखना चाहिए। ** याद रखें: ** आप डंप कर सकते हैं, और नए सर्वर पर स्थापित कर सकते हैं, ** लेकिन ** डेटा को डंप करने के बाद ** ** अधिक ** नया लेखन होगा, आप नए सर्वर को नए लिखने को सिंक्रनाइज़ करने जा रहे हैं ? – ajreal

+0

बाद के नए डेटा लिखने के लिए, हम इसे mysqlbinlog का उपयोग करके हल करेंगे, जिसे अच्छी तरह से देखभाल की जानी चाहिए। अब मेरी मुख्य चिंता mysqldump का उपयोग कर पहली बार बैकअप होगी। मैं बस यह सुनिश्चित करना चाहता हूं कि mysqldump INSERT को रोक देगा या नहीं। मेरे परीक्षण से, यह नहीं दिखाया जाएगा। बस यह सुनिश्चित करना चाहते हैं कि अन्य अनुभव कैसा है। – sylye

उत्तर

0

mysqldump डिफ़ॉल्ट रूप से --lock-टेबल नहीं जोड़ता है। उपयोग करने का प्रयास करें - लॉक-टेबल मुझे बताएं कि क्या

बीटीडब्लू - आपको एड-लॉक का भी उपयोग करना चाहिए जो आपके आयात को तेज़ी से बनाएगा!

+1

हाय, मैंने फिर से परीक्षण किया है और यह पुष्टि की गई है कि डिफ़ॉल्ट रूप से mysqldump --lock-table जारी करेगा। साबित करने के लिए दो बिंदु। सबसे पहले, 'mysqldump --help | grep lock' 'लॉक-टेबल' दिखाएगा सत्य है। दूसरा, 'mysql> खुली तालिकाओं को दिखाएं;' mysqldump के दौरान होने पर, 'इन_यूज' कॉलम 1 इंगित करेगा, और दूसरा mysql INSERT इसे 2 तक नहीं बदलता है, जिससे यह दिखाया जाता है कि यह एक लॉक रीड लोकल है। तो मेरा सवाल यह है कि, क्या कोई और है जो mysqldump तालिका को लॉक कर रहा है और INSERT को रोकता है? क्योंकि मेरा नहीं था। – sylye

1

मैंने इसे पहले कभी नहीं किया है लेकिन आप डंपिंग करते समय --skip-add-locks आज़मा सकते हैं।

हालांकि इसमें अधिक समय लग सकता है, लेकिन आप कई पैच में डंप कर सकते हैं, जिनमें से प्रत्येक को पूरा करने में बहुत कम समय लगेगा। --skip--add-drop-table जोड़ने से आप इन एकाधिक छोटे डंप को उसी तालिका में फिर से बनाये बिना अपलोड कर सकते हैं। --extended-insert का उपयोग करने से SQL फ़ाइल को बूट करने के लिए छोटा बना दिया जाएगा।

शायद mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql जैसे कुछ कोशिश करें। आप तालिका संरचनाओं डंप और उन्हें आदेश इसे इस तरह करते हैं, या पहले डंप

+0

हाय, सलाह के लिए धन्यवाद। लेकिन फिलहाल मेरी मुख्य चिंता mysqldump समय को कम करने की कोशिश नहीं कर रही है, क्योंकि डेटा बहुत अधिक है। मेरा इरादा पता लगाना होगा, 'mysqldump' INSERT को रोक देगा या नहीं, जबकि यह चल रहा है। किसी के लिए खोज रहे हैं जो पहले किया है। – sylye

1

1) के लिए --skip-एड-ड्रॉप-तालिका को दूर करने में पहला अपलोड करने के लिए की आवश्यकता होगी--opt का प्रयोग एक ही है --add-drop-table, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, और --set-charset निर्दिष्ट करते हुए। --opt के सभी विकल्प डिफ़ॉल्ट रूप से चालू हैं क्योंकि --opt डिफ़ॉल्ट रूप से चालू है।

2) mysqldump पंक्ति द्वारा तालिका सामग्री पंक्ति को पुनर्प्राप्त और डंप कर सकता है, या यह पूरी सामग्री को किसी तालिका से पुनर्प्राप्त कर सकता है और इसे डंप करने से पहले स्मृति में बफर कर सकता है। यदि आप बड़ी टेबल डंप कर रहे हैं तो स्मृति में बफरिंग एक समस्या हो सकती है। पंक्ति से पंक्तियों को पंक्तिबद्ध करने के लिए, --quick विकल्प (या --opt का उपयोग करें, जो --quick को सक्षम करता है) का उपयोग करें। --opt विकल्प (और इसलिए --quick) डिफ़ॉल्ट रूप से सक्षम है, इसलिए मेमोरी बफरिंग सक्षम करने के लिए, --skip-quick का उपयोग करें।

3)--single-transaction यह विकल्प सर्वर से डेटा डंपिंग (लेन-देन संबंधी टेबल InnoDB) से पहले एक BEGIN SQL बयान जारी करता है।

यदि आपका स्कीमा दोनों InnoDB और MyISAM का एक संयोजन है, निम्न उदाहरण तुम्हारी मदद करेगा:

mysqldump -uuid -ppwd --skip-opt --single-transaction --max_allowed_packet=512M db > db.sql 
2

अब, आप असंबद्ध टेबल के साथ एक डेटाबेस है, या एक डाटा वेयरहाउस हो सकता है - जहां सब कुछ नहीं है सामान्यीकृत (बिल्कुल), और जहां टेबल के बीच इतना लिंक नहीं है। उस स्थिति में, कोई भी डंप काम करेगा।

मैं मानता हूं कि 38 जी डेटा वाले उत्पादन डेटाबेस में कुछ रूपों (बीएलओबी) के ग्राफिक्स हैं, और फिर - सर्वव्यापी - आपके पास अन्य तालिकाओं से लिंक हैं। सही?

इसलिए, आप हैं - जहां तक ​​मैं इसे देख सकता हूं - तालिकाओं (आमतौर पर प्राथमिक/विदेशी कुंजी जोड़े) के बीच गंभीर लिंक खोने के जोखिम पर, आप अद्यतन/डालने के बिंदु पर एक तालिका को कैप्चर कर सकते हैं , जबकि इसके आश्रित (जो उस तालिका का प्राथमिक स्रोत के रूप में उपयोग करता है) अभी तक अपडेट नहीं किया गया है। इस प्रकार, आप अपने डेटाबेस की तथाकथित अखंडता को खो देंगे।

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

इस प्रकार, आप निश्चित रूप से ताले के बिना अपनी तालिका को कॉपी करने और ऊपर दिए गए अन्य प्रस्तावों के साथ दूर हो सकते हैं - लेकिन आपको अपनी उंगलियों को जलाने का जोखिम है, और इस पर निर्भर करता है कि ऑपरेशन कितने संवेदनशील हैं - आप खुद को गंभीर रूप से जला सकते हैं या बस सतह खरोंच प्राप्त कर सकते हैं।

उदाहरण: अपने डेटाबेस एक महत्वपूर्ण मिशन डेटाबेस सिस्टम, एक आईसीयू में जीवन रक्षक उपकरणों के लिए सिफारिश की दिल की धड़कन की दर से युक्त है, तो मैं दो बार से अधिक लगता होगा, इससे पहले कि मैं प्रवास करते हैं।

अगर, हालांकि, डेटाबेस फेसबुक या इसी तरह की साइट से चित्र शामिल = तुम 129,388 खो लिंक :-) 0 से कुछ भी करने के परिणामों के साथ रहने के लिए सक्षम हो सकता है।

अब - विश्लेषण के लिए बहुत बहुत। समाधान:

आप एक सॉफ्टवेयर है जो पूरी निष्ठा, टेबल सेट टेबल सेट द्वारा, टपल द्वारा टपल साथ आप के लिए डंप करता है बनाने के लिए होगा। आपको डेटा के उस समूह की पहचान करने की आवश्यकता है, जिसे आपके वर्तमान ऑनलाइन 24/7/365 आधार से अपने नए आधार पर कॉपी किया जा सकता है, फिर ऐसा करें, फिर चिह्नित करें कि इसकी प्रतिलिपि बनाई गई है।

IFFF अब रिकॉर्ड आप पहले से ही की नकल की है करने के लिए होते हैं बदलता है, तो आप उन के बाद प्रतिलिपि करने की आवश्यकता होगी। ऐसा करने के लिए यह एक मुश्किल मामला हो सकता है।

आईएफएफएफ आप MYSQL का एक और उन्नत संस्करण चला रहे हैं - आप वास्तव में एक और साइट और/या प्रतिकृति या वितरित डेटाबेस बना सकते हैं - और फिर इस तरह से दूर हो जाएं।

IFFF आप की एक खिड़की 10 मिनट का कहना है, जो आप यदि आपको आवश्यकता है तो आप भी सिर्फ भौतिक फ़ाइलें, ड्राइव पर स्थित कॉपी कर सकते हैं बना सकते हैं, की मदद से की है। मैं .stm .std - और इतने पर - फ़ाइलों के बारे में बात कर रहा हूं - फिर आप सर्वर को कुछ मिनट के लिए बंद कर सकते हैं, फिर कॉपी करें।

अब एक प्रमुख सवाल का:

आप समय-समय पर अपने मशीनों के रखरखाव की ज़रूरत है। क्या आपके सिस्टम को उस तरह के परिचालनों के लिए जगह नहीं मिली है? यदि नहीं - तो हार्ड डिस्क दुर्घटनाग्रस्त होने पर आप क्या करेंगे। 'कब' पर ध्यान दें - नहीं 'अगर'।

+0

38 जीबी डेटाबेस आकार ग्राफिक्स या बीएलओबी सामग्री को कैसे इंगित करता है? – MattBianco

संबंधित मुद्दे