MySQL के लिए Transactional DDL वर्कफ़्लो


25

मैं एक छोटे से खोज करने के लिए है कि DDL बयान (हैरान कर दिया था alter table, create indexआदि) परोक्ष MySQL में वर्तमान लेन-देन के लिए प्रतिबद्ध। एमएस एसक्यूएल सर्वर से आ रहा है, स्थानीय रूप से लेनदेन में डेटाबेस परिवर्तन करने की क्षमता (जो तब वापस लुढ़का था) मेरे वर्कफ़्लो का एक महत्वपूर्ण हिस्सा था। निरंतर एकीकरण के लिए, रोलबैक का उपयोग किया जाता था यदि माइग्रेशन किसी भी कारण से हिचकी लेता था, ताकि कम से कम हम डेटाबेस को आधे-माइग्रेट किए गए राज्य में न छोड़ें।

माइग्रेशन और निरंतर एकीकरण के साथ MySQL का उपयोग करते समय लोग इन दो समस्याओं को कैसे हल करते हैं?


क्रॉस एसओ से पोस्ट किया गया। stackoverflow.com/q/28197013/614523 वहाँ पर बहुत प्यार नहीं मिला।
13

1
कंटीन्यूअस इंटीग्रेशन के लिए, LVM स्नैपशॉट को बहुत तेज़ी से एक संपूर्ण वातावरण बनाने का एक तरीका मानें जो एक ज्ञात स्थिति में है।
रिक जेम्स

5
आप हमेशा पोस्टग्रेज में अपग्रेड कर सकते हैं - यह ट्रांसेक्शनल डीडीएल (एससीएनआर) का समर्थन करता है।
a_horse_with_no_name

3
मैं @a_horse_with_no_name से सहमत हूं, अगर यह आपका वर्कफ़्लो है, तो गंभीरता से पॉज़रेकसक्यूड के उपयोग पर विचार करें, जिसमें कई अन्य अच्छी विशेषताओं के साथ एक साथ ट्रांज़ेक्शनल डीडीएल है।
रेनजो

जवाबों:


9

कई लोगों के लिए, MySQL Achilles की एड़ी निहित है।

पृष्ठ 418 के अनुसार पुस्तक के अनुच्छेद 3

MySQL 5.0 प्रमाणन अध्ययन गाइड

निम्नलिखित आदेश लेनदेन को तोड़ सकते हैं और कर सकते हैं

  • 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 के कई चलती हिस्से हैं

  • सिस्टम टेबल्सस्पेस
    • डेटा शब्दकोश
    • डबल लिखें बफर (क्रैश रिकवरी के लिए उपयोग की गई डेटा संगतता)
    • बफ़र डालें (द्वितीयक गैर-अनन्य अनुक्रमणिका में बफ़र परिवर्तन)
    • रोलबैक सेगमेंट
    • पूर्ववत करें (जहां सबसे अनियंत्रित विकास हो सकता है)
  • InnoDB बफर पूल
    • डर्टी डेटा पेज
    • डर्टी इंडेक्स पेज
    • NonUnique Index में परिवर्तन
  • अन्य महत्वपूर्ण मेमोरी कैश

बफर-पूल और मेमोरी कैश में तैरते हुए बिना परिवर्तन किए हुए सभी-इनओडीबी डेटाबेस के एलवीएम स्नैपशॉट लेने से एक डेटासेट मिलेगा जिसमें LUN के बहाल होने के बाद और Mysqld शुरू होने पर InnoDB क्रैश रिकवरी की आवश्यकता होगी।

ऑल-इनोबीडीबी के लिए सहायता

यदि आप स्नैपशॉट लेने से पहले MySQL को बंद कर सकते हैं

    1. रन SET GLOBAL innodb_fast_shutdown = 0;
    1. रन SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. रन SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. चरण 3 को दोहराएं जब तक कि Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
    1. service mysql stop
    1. LVM स्नैपशॉट लें
    1. service mysql stop

यदि आप शटडाउन नहीं कर सकते हैं लेकिन MySQL लाइव के साथ स्नैपशॉट ले लो

    1. रन SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. रन SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. चरण 2 को तब तक दोहराएं जब तक Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
    1. LVM स्नैपशॉट लें
    1. रन SET GLOBAL innodb_max_dirty_pages_pct = 75;

ऑल-मायिसम डेटाबेस या इनोबीडी / मायिसम मिक्स

MyISAM, जब पहुंचता है, तो इसके खिलाफ खुले फ़ाइल हैंडल की एक गिनती रखता है। यदि MySQL क्रैश हो जाता है, तो ओपन फाइल हैंडल काउंट 0 के साथ कोई भी MyISAM टेबल क्रैश के रूप में और मरम्मत की आवश्यकता के रूप में चिह्नित किया जाएगा (भले ही डेटा के साथ कुछ भी गलत न हो)।

एक डेटाबेस का LVM स्नैपशॉट लेने से, जिसमें MyISAM तालिकाओं का उपयोग होता है, स्नैपशॉट को पुनर्स्थापित करने और mysqld शुरू होने पर मरम्मत की आवश्यकता में एक या अधिक MyISAM तालिकाओं की आवश्यकता होगी।

ऑल-मायिसम या इनोबीडी / मायिसम मिक्स के लिए सहायता

यदि आप स्नैपशॉट लेने से पहले MySQL को बंद कर सकते हैं

    1. रन SET GLOBAL innodb_fast_shutdown = 0;
    1. रन SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. रन SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. चरण 3 को दोहराएं जब तक कि Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
    1. service mysql stop
    1. LVM स्नैपशॉट लें
    1. service mysql stop

यदि आप शटडाउन नहीं कर सकते हैं लेकिन MySQL लाइव के साथ स्नैपशॉट ले लो

आप कुछ InnoDB तालिकाओं के निस्तब्धता को लागू कर सकते हैं

    1. रन SET GLOBAL innodb_max_dirty_pages_pct = 0;
    1. रन SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_pages_dirty';
    1. चरण 2 को तब तक दोहराएं जब तक Innodb_buffer_pool_pages_dirty 0 या जितना संभव हो उतना 0 के करीब है
    1. FLUSH TABLES innodb_tbl1,... FOR EXPORT;महत्वपूर्ण InnoDB तालिकाओं पर चलाएँ
    1. रन FLUSH TABLES WITH READ LOCK;
    1. LVM स्नैपशॉट लें
    1. रन UNLOCK TABLES;
    1. रन 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 का स्नैपशॉट लेना चाहते हैं।

4

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

एक उत्पादन परिनियोजन प्रक्रिया में आप आमतौर पर अपने परिवर्तनों का परीक्षण करने के लिए देव, QA या यहां तक ​​कि पूर्व-उत्पादन वातावरण से गुजरते हैं, उसी तरह आप किसी भी कोड परिवर्तन के लिए।

ध्यान दें कि यह MySQL विशिष्ट नहीं है: Oracle डेटाबेस 'परिवर्तन तालिका' आदि जारी करते समय COMMIT भी संक्षेप में करेंगे।

अब यदि आप अपने आप को सुरक्षित रखना चाहते हैं, तो आप निश्चित रूप से पहले से बैकअप कर सकते हैं, या LVM या फाइलसिस्टम स्नैपशॉट अगर आपका सिस्टम ऐसा कर सकता है। आपके पास एक गुलाम भी हो सकता है जिसे आप संवेदनशील संचालन से पहले सुरक्षा के रूप में देरी / रोक सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.