बहुत बड़े mysql तालिकाओं के स्तंभों को कम या बिना डाउनटाइम के संशोधित करना


18

मुझे समय-समय पर mysql 5.1 में टेबलों में बदलाव करने की आवश्यकता होती है, ज्यादातर कॉलम जोड़ते हैं। परिवर्तन तालिका आदेश के साथ बहुत सरल है। लेकिन मेरी टेबल में अभी 40 मिलियन पंक्तियां हैं और वे तेजी से बढ़ रहे हैं ... इसलिए उन परिवर्तन तालिका आदेशों में कई घंटे लगते हैं। एक दो महीने में वे दिन लगेंगे जिसका मैं अनुमान लगा रहा हूँ।

जब से मैं अमेजन आरडीएस का उपयोग कर रहा हूं, मेरे पास दास सर्वर के साथ खेलने और फिर मास्टर को बढ़ावा देने के लिए नहीं हो सकता है। तो मेरा सवाल यह है कि क्या न्यूनतम डाउनटाइम के साथ ऐसा करने का कोई तरीका है? मुझे यह मानने में कोई दिक्कत नहीं है कि घंटों या दिनों तक भी अगर उपयोगकर्ता अभी भी db का उपयोग कर सकते हैं ... क्या वे कम से कम पढ़ सकते हैं जबकि कॉलम जोड़े जा रहे हैं? यदि मेरा ऐप लिखने की कोशिश करता है तो क्या होगा? डालें या अपडेट करें? अगर यह तुरंत विफल हो जाता है कि वास्तव में इतना बुरा नहीं है, अगर यह सिर्फ लटका और डीबी सर्वर के लिए समस्या है कि एक बड़ी समस्या है ..

यह एक काफी सामान्य स्केलिंग मुद्दा होना चाहिए, सभी को कॉलम जोड़ने की आवश्यकता है .. आमतौर पर उत्पादन डीबी के लिए क्या किया जाता है? दास -> मास्टर प्रवास?

अपडेट - मैं उल्लेख करना भूल गया कि मैं इनोडब भंडारण इंजन का उपयोग कर रहा हूं


1
मामले में कोई अभी भी एक उत्तर की तलाश में है .. blog.staginginstance.com/… ^ ^
कोडर अनाम

जवाबों:


10

मुझे समय-समय पर mysql 5.1 में टेबलों में बदलाव करने की आवश्यकता होती है, ज्यादातर कॉलम जोड़ते हैं।

मत करो। सच में नहीं। बस नहीं है। यह एक बहुत ही दुर्लभ अवसर होना चाहिए जब यह कभी आवश्यक हो।

अपने डेटा को वास्तव में शुरू करने के लिए सामान्यीकृत माना जाता है, समस्या को हल करने का सही तरीका आधार तालिका में 1: 1 संबंध के साथ एक नई तालिका जोड़ना है (नई तालिका पर गैर-अनिवार्य)।

नियमित रूप से कॉलम जोड़ने से आमतौर पर एक डेटाबेस का एक संकेतक होता है जो सामान्यीकृत नहीं होता है - यदि आपका स्कीमा सामान्य नहीं किया गया है, तो यह समस्या आपको ठीक करने की आवश्यकता है।

अंत में, यदि आपका स्कीमा वास्तव में, वास्तव में सामान्यीकृत है और आपको वास्तव में, वास्तव में कॉलम जोड़ना चाहिए:

  1. सुनिश्चित करें कि आपको डेटाबेस पर टाइमस्टैम्प कॉलम मिला है या यह प्रतिकृति लॉग उत्पन्न कर रहा है
  2. तालिका (A) की एक प्रति (B) बनाएँ
  3. B में नए कॉलम जोड़ें (यह अभी भी myisam के साथ ब्लॉक करेगा)
  4. लेनदेन को अक्षम करें
  5. मूल तालिका (ए) को कुछ और (बैकअप) के रूप में नाम बदलें
  6. मूल तालिका (ए) के नाम के साथ नई तालिका (बी) का नाम बदलें
  7. प्रतिकृति लॉग से या बैकअप तालिका से ऑपरेशन की शुरुआत से लेनदेन को फिर से दोहराएं
  8. लेनदेन सक्षम करें।

2
आपके कदम से कदम के लिए धन्यवाद। क्या तालिकाओं को संशोधित करना वास्तव में असामान्य है? मैं समझता हूं कि मैं नए स्तंभ के साथ एक और तालिका जोड़ सकता हूं (स्तंभ जोड़ने की आवश्यकता के मामले में) और यह 1: 1 संबंध में मूल बड़ी तालिका का संदर्भ देता है। लेकिन 15 बहुत बड़ी 1: 1 तालिकाओं का होना सही नहीं लगता है, जब वे सभी 1 तालिका में होनी चाहिए ... निश्चित रूप से क्वेरी का प्रदर्शन तब भी होता है, न कि अनुक्रमण समस्याओं का उल्लेख करने के लिए। मैं एक विशेषज्ञ नहीं हूं, लेकिन मेरा डेटाबेस काफी हद तक सामान्यीकृत है और यह स्वाभाविक है कि मुझे समय-समय पर संशोधित करने की आवश्यकता है ..
apptree

2
"क्या तालिकाओं को संशोधित करना वास्तव में असामान्य है?" - हाँ।
सिम्बियन

1
नहीं, लेकिन कोई यह तर्क दे सकता है कि यदि ऐसा होता है, तो इसके बारे में - एक बड़े सॉफ़्टवेयर अपग्रेड के हिस्से के रूप में नहीं - तो किसी को यह एहसास नहीं होने के लिए निकाल दिया जाना चाहिए कि सभी तालिकाओं को पहले स्थान पर होना चाहिए। यहाँ समस्या / चाल "नियमित रूप से" है, न कि "एक बार हर महीने में"।
टॉमटॉम

22
एक देव के रूप में, विशेष रूप से एक जो स्टार्ट-अप्स और युवा कंपनियों में काम करता है, मैं सहजीवन और @TomTom के साथ कम सहमत नहीं हो सका। चीजें बदल जाती हैं, उत्पाद बदल जाते हैं, व्यावसायिक लक्ष्य बदल जाते हैं और डेटाबेस संरचना को उनके साथ बदलना पड़ता है। अच्छी DBA सेवा प्रदान करने का अर्थ है उन परिवर्तनों के लिए "हाँ", फिर यह पता लगाना कि उन्हें कुशलतापूर्वक कैसे लागू किया जाए। भारी-सामान्यीकृत डेटाबेस एक अवधारणा है जो बहुत पहले मर गया। वे खराब प्रदर्शन और धीमी गति के चक्र के परिणामस्वरूप होते हैं।
pents90

4
तालिकाओं को बदलने के लिए असामान्य ??? शायद बड़ी कंपनियों में, लेकिन फुर्तीली टीम में जो अक्सर होता है, आवश्यकताओं में बदलाव होता है ...
टिबो

12

मुझे हाल ही में ऐसा करना पड़ा। अमेज़ॅन ने जो सिफारिश की वह पेरकोना टूलकिट का उपयोग कर रहा था। मैंने इसे डाउनलोड किया और कुछ चलाने में सक्षम था:

./pt-online-schema-change h=databasenameHostName,D=databasename,t=tablename --recursion-method=none --execute --user username --password password --alter "MODIFY someColumn newDataType"

और यह बहुत अच्छा काम करता है। यह बताता है कि प्रक्रिया में कितना समय शेष है।

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


पीटीसी-ऑनलाइन-स्कीमा-चेंजिंग टूल द्वारा आवश्यक RDS पैरामीटर समूहों (जैसे SET GLOBAL log_bin_trust_function_creators = 1 RDS पर काम करना) के माध्यम से, पेरकोना टीम को log_bin_trust_function_creators सुविधा को सक्षम करने पर एक छोटा लेखन होता है। अधिक जानकारी: percona.com/blog/2016/07/01/pt-online-schema-change-amazon-rds
user1652110

मेरे लिए काम किया
Adiii

4

सिम्बियन कुछ ठोस सिफारिशें प्रदान करता है ।

अपने प्रश्न का उत्तर देने के लिए, प्रभाव को कम करने का सबसे आसान और सबसे अच्छा तरीका कई डेटाबेस की नकल करना है। सक्रिय पर प्रतिकृति को रोकने के लिए एक उपयुक्त विफलता प्रक्रिया के साथ दोहरी मास्टर, जो सक्रिय को प्रभावित किए बिना निष्क्रिय पर एक परिवर्तन की अनुमति देता है।

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

अंततः, यदि आपका डेटा सेट इतना बड़ा हो रहा है, तो आपको OLTP और OLAP डेटाबेस के बीच अभिलेखीयता पर भी विचार करने की आवश्यकता है । यदि आप उचित रूप से डिजाइन करते हैं तो आपके लेन-देन डेटासेट को इतना बड़ा होने की आवश्यकता नहीं है।


2

मैनुअल से: http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

ज्यादातर मामलों में, ALTER TABLE मूल तालिका की एक अस्थायी प्रतिलिपि बनाता है। MySQL कॉपी में परिवर्तन को शामिल करता है, फिर मूल तालिका को हटाता है और नए का नाम बदलता है। जबकि ALTER TABLE निष्पादित कर रहा है, मूल तालिका अन्य सत्रों द्वारा पठनीय है। तालिका में अद्यतन और लिखते हैं जब तक कि नई तालिका तैयार न हो जाए, तब तक रोक दिया जाता है, और फिर स्वचालित रूप से बिना किसी अद्यतन के नई तालिका में पुनः निर्देशित कर दिया जाता है।

तो, पढ़ना ठीक काम करेगा। राइट्स को रोक दिया जाएगा, लेकिन बाद में निष्पादित किया जाएगा। यदि आप इसे रोकना चाहते हैं, तो आपको अपने सॉफ़्टवेयर को संशोधित करना होगा।


इसलिए मैंने ऐसा किया है और अपनी साइट के उन हिस्सों को निष्क्रिय कर दिया है जो उस तालिका को लिखते हैं जिसे मैं अभी संशोधित कर रहा हूं। अब तक मुझे कई "लॉक प्रतीक्षा समय समाप्त हो गए हैं; लेनदेन को फिर से शुरू करने की कोशिश करें" अपवाद, यह बहुत बुरा नहीं है। हालांकि, वे पूरी तरह से पढ़े गए ऑपरेशन पर थे ...
apptree

0

मैं ऐसी ही स्थिति में हूं, जहां मुझे अपनी लेनदेन तालिका में से 1 को बदलना होगा, जो लगभग 65GB है। मैं 2 समाधान सुनता हूं

  1. सीधे आगे का प्रयोग करें और इसे चलाने दें (घंटे या दिन के एक्स नंबर)
  2. सुनिश्चित करें कि आपको डेटाबेस पर टाइमस्टैम्प कॉलम मिला है या यह प्रतिकृति लॉग उत्पन्न कर रहा है
    • तालिका (A) की एक प्रति (B) बनाएँ
    • B में नए कॉलम जोड़ें (यह अभी भी myisam के साथ ब्लॉक करेगा)
    • लेनदेन को अक्षम करें
    • मूल तालिका (ए) को कुछ और (बैकअप) के रूप में नाम बदलें
    • मूल तालिका (ए) के नाम के साथ नई तालिका (बी) का नाम बदलें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.