कई लोगों के लिए, MySQL Achilles की एड़ी निहित है।
पृष्ठ 418 के अनुसार पुस्तक के अनुच्छेद 3
निम्नलिखित आदेश लेनदेन को तोड़ सकते हैं और कर सकते हैं
ALTER TABLE
BEGIN
CREATE INDEX
DROP DATABASE
DROP INDEX
DROP TABLE
RENAME TABLE
TRUNCATE TABLE
LOCK TABLES
UNLOCK TABLES
SET AUTOCOMMIT = 1
START TRANSACTION
सुझाव
जब यह MySQL की बात आती है, तो आपके द्वारा निर्मित किसी भी कंटीन्यूअसइनग्रेशन (CI) / सेल्फ सर्विस को हमेशा ट्रांजेक्शनल जॉब और DDL स्क्रिप्ट को परस्पर अनन्य बनाना चाहिए।
यह आपको प्रतिमान बनाने का अवसर देता है जो होगा
- समर्थन लेनदेन जो
START TRANSACTION/COMMIT
ब्लॉक के साथ ठीक से अलग-थलग हैं
- डीडीएल का नियंत्रण अपने आप को डीडीएल को नियंत्रित करके, ऐसे डीडीएल को निर्माणकर्ता या विध्वंसक के रूप में चला रहा है
- कंस्ट्रक्टर: एक नई डिजाइन के साथ टेबल्स बनाने के लिए डीडीएल
- विध्वंसक: डीडीएल टेबल्स को पिछला डिजाइन में वापस लाने के लिए
- एक काम के तहत इन ऑपरेशनों को कभी संयोजित न करें
चेतावनी: यदि आप इस के लिए MyISAM का उपयोग कर रहे हैं, तो आप (संयुक्त राष्ट्र) कृपया MyISAM को उन चीजों की सूची में जोड़ सकते हैं जो लेनदेन को तोड़ सकती हैं, शायद निहित प्रतिबद्ध के संदर्भ में नहीं, लेकिन निश्चित रूप से डेटा स्थिरता के मामले में एक रोलबैक होना चाहिए। जरूरत है।
LVM क्यों नहीं?
LVM स्नैपशॉट बहुत बढ़िया हैं और भारी SQL प्रोसेसिंग करने के बिना डेटाबेस के पूरे इंस्टेंस को पुनर्स्थापित करना आदर्श है। हालाँकि, जब यह MySQL की बात आती है, तो आपको दो स्टोरेज इंजनों के लिए हिसाब देना होगा: InnoDB और MyISAM।
ऑल-इनोबीडी डेटाबेस
InnoDB की वास्तुकला को देखें (Percona CTO वादिम Tkachenko के चित्र शिष्टाचार)
InnoDB के कई चलती हिस्से हैं
- सिस्टम टेबल्सस्पेस
- डेटा शब्दकोश
- डबल लिखें बफर (क्रैश रिकवरी के लिए उपयोग की गई डेटा संगतता)
- बफ़र डालें (द्वितीयक गैर-अनन्य अनुक्रमणिका में बफ़र परिवर्तन)
- रोलबैक सेगमेंट
- पूर्ववत करें (जहां सबसे अनियंत्रित विकास हो सकता है)
- InnoDB बफर पूल
- डर्टी डेटा पेज
- डर्टी इंडेक्स पेज
- NonUnique Index में परिवर्तन
- अन्य महत्वपूर्ण मेमोरी कैश
बफर-पूल और मेमोरी कैश में तैरते हुए बिना परिवर्तन किए हुए सभी-इनओडीबी डेटाबेस के एलवीएम स्नैपशॉट लेने से एक डेटासेट मिलेगा जिसमें LUN के बहाल होने के बाद और Mysqld शुरू होने पर InnoDB क्रैश रिकवरी की आवश्यकता होगी।
ऑल-इनोबीडीबी के लिए सहायता
यदि आप स्नैपशॉट लेने से पहले MySQL को बंद कर सकते हैं
- रन
SET GLOBAL innodb_fast_shutdown = 0;
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- रन
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- चरण 3 को दोहराएं जब तक कि Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
service mysql stop
- LVM स्नैपशॉट लें
service mysql stop
यदि आप शटडाउन नहीं कर सकते हैं लेकिन MySQL लाइव के साथ स्नैपशॉट ले लो
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- रन
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- चरण 2 को तब तक दोहराएं जब तक Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
- LVM स्नैपशॉट लें
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 75;
ऑल-मायिसम डेटाबेस या इनोबीडी / मायिसम मिक्स
MyISAM, जब पहुंचता है, तो इसके खिलाफ खुले फ़ाइल हैंडल की एक गिनती रखता है। यदि MySQL क्रैश हो जाता है, तो ओपन फाइल हैंडल काउंट 0 के साथ कोई भी MyISAM टेबल क्रैश के रूप में और मरम्मत की आवश्यकता के रूप में चिह्नित किया जाएगा (भले ही डेटा के साथ कुछ भी गलत न हो)।
एक डेटाबेस का LVM स्नैपशॉट लेने से, जिसमें MyISAM तालिकाओं का उपयोग होता है, स्नैपशॉट को पुनर्स्थापित करने और mysqld शुरू होने पर मरम्मत की आवश्यकता में एक या अधिक MyISAM तालिकाओं की आवश्यकता होगी।
ऑल-मायिसम या इनोबीडी / मायिसम मिक्स के लिए सहायता
यदि आप स्नैपशॉट लेने से पहले MySQL को बंद कर सकते हैं
- रन
SET GLOBAL innodb_fast_shutdown = 0;
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- रन
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- चरण 3 को दोहराएं जब तक कि Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
service mysql stop
- LVM स्नैपशॉट लें
service mysql stop
यदि आप शटडाउन नहीं कर सकते हैं लेकिन MySQL लाइव के साथ स्नैपशॉट ले लो
आप कुछ InnoDB तालिकाओं के निस्तब्धता को लागू कर सकते हैं
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 0;
- रन
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
- चरण 2 को तब तक दोहराएं जब तक Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
FLUSH TABLES innodb_tbl1,... FOR EXPORT;
महत्वपूर्ण InnoDB तालिकाओं पर चलाएँ
- रन
FLUSH TABLES WITH READ LOCK;
- LVM स्नैपशॉट लें
- रन
UNLOCK TABLES;
- रन
SET GLOBAL innodb_max_dirty_pages_pct = 75;
MySQL प्रतिकृति मदद कर सकता है?
जब आप दो सर्वरों के लिए एक LVM स्नैपशॉट को पुनर्स्थापित कर सकते हैं और MySQL Master / स्लेव प्रतिकृति को सेटअप कर सकते हैं, जो स्नैपशॉट को पुनर्स्थापित करते समय गृहकर का एक अतिरिक्त स्रोत बन जाता है।
यदि आप एक मास्टर पर CI जॉब चलाते हैं और वे जॉब छोटे हैं, तो कुछ निश्चित परिस्थितियों में प्रतिकृति एक समय पर काम कर सकती है। आप बस STOP SLAVE;
स्लेव पर चल सकते हैं , मास्टर पर CI नौकरियों को बंद कर सकते हैं, और START SLAVE;
मास्टर के डेटा प्रमाणित होने पर स्लेव पर चल सकते हैं ।
यदि CI जॉब्स बहुत अधिक डेटा को सचेत करते हैं, तो आप LVM स्नैपशॉट और सेटअप प्रतिकृति को खरोंच से पुनर्स्थापित कर सकते हैं। यदि आप अपने आप को अक्सर ऐसा करते हुए पाते हैं, तो आप शायद MySQL प्रतिकृति स्थापित करने के साथ कर सकते हैं।
अंतिम विचार
- पुनर्स्थापित और प्रतिगमन परीक्षण करने के लिए कई DB सर्वर (3 या अधिक) का उपयोग करना सबसे अच्छा है।
- शेष MyISAM तालिकाओं को InnoDB में कनवर्ट करें यदि उन तालिकाओं को MyISAM बने रहने की आवश्यकता नहीं है।
- यदि आपकी डेटा सामग्री संवेदनशील है, तो आपको किसी भी परीक्षण को शुरू करने से पहले स्नैपशॉट को पुनर्स्थापित करने के बाद डेटा को साफ़ करने के लिए CI जॉब निष्पादित करना चाहिए। एक विकल्प के रूप में, आप पहले से स्क्रब किए गए डेटा के साथ MySQL का स्नैपशॉट लेना चाहते हैं।