तालिका को लॉक किए बिना तालिका में फेरबदल करें?


107

MySQL में ALTER TABLE स्टेटमेंट करते समय, स्टेटमेंट की अवधि के लिए पूरी टेबल को रीड-लॉक किया जाता है (समवर्ती रीड की अनुमति देता है, लेकिन समवर्ती लेखन को प्रतिबंधित करता है)। यदि यह एक बड़ी तालिका है, तो INSERT या UPDATE स्टेटमेंट्स को looooong समय के लिए ब्लॉक किया जा सकता है। क्या एक "हॉट चेंज" करने का एक तरीका है, जैसे एक कॉलम को इस तरह से जोड़ना कि पूरी प्रक्रिया के दौरान टेबल अभी भी अपडेट है?

ज्यादातर मैं MySQL के लिए एक समाधान में रुचि रखता हूँ, लेकिन अगर MySQL यह नहीं कर सकता है तो मुझे अन्य RDBMS में दिलचस्पी होगी।

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


2
आश्चर्य होगा कि आप कितनी बार तालिका को बदलेंगे?
एलन लालोंडे

1
IMHO, डेटाबेस स्कीमा परिवर्तन पूरे नए संस्करणों के साथ जुड़े हैं - वे अन्य परिवर्तनों की तरह छिटपुट रूप से लुढ़के नहीं हैं। यह अनिवार्य रूप से एक बड़ी बात है।
dkretz

9
@AllainLalonde - 0 से अधिक बार इस सवाल को वैध बनाता है, खासकर यदि आपके सिस्टम में डाउनटाइम पर जीवन या बहुत सारे पैसे खर्च होंगे। और किसी भी दर पर, नए सॉफ्टवेयर की आवश्यकताएं कभी-कभी दिखाई देती हैं।
नाथन लॉन्ग

जवाबों:


60

केवल अन्य विकल्प मैन्युअल रूप से करना है जो कि कई RDBMS सिस्टम वैसे भी करते हैं ...
- एक नई तालिका बनाएं

फिर आप एक बार में पुराने टेबल की सामग्री को एक चंक पर कॉपी कर सकते हैं। जब भी हमेशा स्रोत तालिका पर किसी भी INSERT / UPDATE / DELETE से सावधान रहना चाहिए। (एक ट्रिगर द्वारा प्रबंधित किया जा सकता है। हालांकि यह एक धीमा कारण होगा, यह एक ताला नहीं है ...)

एक बार समाप्त होने के बाद, स्रोत तालिका का नाम बदलें, फिर नई तालिका का नाम बदलें। अधिमानतः एक लेनदेन में।

एक बार समाप्त होने के बाद, किसी भी संग्रहीत कार्यविधियों को पुन: व्यवस्थित करें, आदि जो उस तालिका का उपयोग करते हैं। निष्पादन योजनाएं अब मान्य नहीं होंगी।

संपादित करें:

इस सीमा के थोड़ा गरीब होने के बारे में कुछ टिप्पणियां की गई हैं। तो मैंने सोचा कि मैं इसे दिखाने के लिए एक नया दृष्टिकोण रखूंगा कि ऐसा क्यों है ...

  • एक नया क्षेत्र जोड़ना हर पंक्ति में एक क्षेत्र को बदलने जैसा है।
  • फ़ील्ड लॉक रो लॉक की तुलना में बहुत कठिन होगा, कभी भी टेबल लॉक नहीं होगा।

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

2
और स्वैप करने से पहले पूरी तरह से परीक्षण की योजना है। यदि यह विफल रहता है, तो शुरू करें।
dkretz

2
ट्रिगर के माध्यम से सिंक्रनाइज़ेशन का प्रबंधन करना एक अच्छा विचार था। मैं MySQL का उपयोग इतने लंबे समय से कर रहा हूं कि मैं भूल जाता हूं कि उनके पास अब ट्रिगर है। मैंने इस तकनीक का उपयोग किया है और अब मेरे पास एक कार्यात्मक हॉट-चेंज स्क्रिप्ट है। एक प्रगति पट्टी के साथ। और यह MyISAM के साथ काम करता है। ज़िंदगी अच्छी है।
डैनियल

2
+1 यह शाब्दिक है कि जब आप यूआई में कुछ प्रकार के तालिका परिवर्तन करते हैं तो एसक्यूएल एंटरप्राइज मैनेजर पर्दे के पीछे क्या करता है। SQL 2008 में, उन्होंने वास्तव में एक चेतावनी जोड़ी ताकि उपयोगकर्ता इस कठोर कार्रवाई को जान सके।
ब्रैड

2
आपने उन विदेशी कुंजियों के बारे में कुछ भी उल्लेख नहीं किया है जिन्हें बदल दिया जा रहा है। यह एक समस्या नहीं होगी?
रफय

2
@MohammadRafayAleem - और AUTOINCREMENT क्षेत्र, और विचार, और ट्रिगर, आदि, आदि, लेकिन फिर भी, दृष्टिकोण अभी भी व्यावहारिक है।
MatBailie 16

42

Percona pt- online- स्कीमा-परिवर्तन नामक एक उपकरण बनाता है जो इसे करने की अनुमति देता है।

यह अनिवार्य रूप से तालिका की एक प्रति बनाता है और नई तालिका को संशोधित करता है। नई तालिका को मूल के साथ सिंक में रखने के लिए यह अद्यतन करने के लिए ट्रिगर्स का उपयोग करता है। यह मूल तालिका तक पहुंचने की अनुमति देता है जबकि नई तालिका पृष्ठभूमि में तैयार की जाती है।

यह ऊपर बताई गई विधि के समान है, लेकिन स्वचालित शैली में ऐसा होता है।

उनके कुछ टूल्स में एक लर्निंग कर्व होता है, अर्थात् डेटाबेस से कनेक्ट होता है, लेकिन एक बार जब आप नीचे आ जाते हैं, तो उनके पास महान उपकरण होते हैं।

उदाहरण के लिए:

pt-online-schema-change --alter "ADD COLUMN c1 INT" D=db,t=numbers_are_friends

लगता है लिंक टूट गया है। मुझे यह लिंक काम करने वाला लगा।
नोम बेन अरी

25

2009 से यह प्रश्न। अब MySQL एक समाधान प्रदान करता है:

ऑनलाइन डीडीएल (डेटा परिभाषा भाषा)

एक विशेषता जो DDL (मुख्य रूप से परिवर्तन तालिका) के संचालन के दौरान InnoDB तालिकाओं के प्रदर्शन, संगति और उपलब्धता में सुधार करती है। विवरण के लिए धारा 14.11, “InnoDB और ऑनलाइन DDL” देखें।

ऑपरेशन के प्रकार के अनुसार विवरण भिन्न होता है। कुछ मामलों में, तालिका को समवर्ती रूप से संशोधित किया जा सकता है जबकि ALTER TABLE प्रगति पर है। ऑपरेशन टेबल कॉपी के बिना, या विशेष रूप से अनुकूलित प्रकार की टेबल कॉपी का उपयोग किए बिना किया जा सकता है। अंतरिक्ष उपयोग innodb_online_alter_log_max_size कॉन्फ़िगरेशन विकल्प द्वारा नियंत्रित किया जाता है।

यह आपको DDL ऑपरेशन के दौरान प्रदर्शन और संगामिति के बीच संतुलन को समायोजित करने देता है, यह चुनने के लिए कि क्या पूरी तरह से तालिका (LOCK = EXCLUSIVE क्लॉज) तक पहुंच को अवरुद्ध करने के लिए, प्रश्नों की अनुमति दें, लेकिन DML (लॉक = साझा खंड), या पूर्ण क्वेरी और DML की अनुमति न दें टेबल तक पहुंच (LOCK = NONE क्लॉज)। जब आप LOCK क्लॉज़ को छोड़ देते हैं या LOCK = DEFAULT को निर्दिष्ट करते हैं, तो MySQL ऑपरेशन के प्रकार के आधार पर जितना संभव हो सके उतना समरूपता की अनुमति देता है।

तालिका की नई प्रतिलिपि बनाने के बजाय, जहां संभव हो, वहां परिवर्तन करना, डिस्क स्थान उपयोग में अस्थायी वृद्धि से बचता है और I / O ओवरहेड तालिका की प्रतिलिपि बनाने और द्वितीयक अनुक्रमणिका को पुन: निर्मित करने से संबंधित है।

देखना MySQL 5.6 संदर्भ मैनुअल -> InnoDB और ऑनलाइन DDL अधिक जानकारी के लिए।

ऐसा लगता है कि मारियाडीबी में ऑनलाइन डीडीएल भी उपलब्ध है

वैकल्पिक रूप से आप यह सुनिश्चित करने के लिए ALTER ऑनलाइन टेबल का उपयोग कर सकते हैं कि आपका अलर्ट टेबल समवर्ती संचालन को अवरुद्ध नहीं करता है (कोई ताले नहीं लेता है)। यह LOCK = NONE के बराबर है।

अल्बर्ट टेबल के बारे में मारियाडीबी केबी


3
यह शर्म की बात है कि वोट के अलावा इसे शीर्ष पर लाने के लिए कोई रास्ता नहीं है, यह ज्यादातर अन्य सभी उत्तरों को पूरी तरह से नकार देता है क्योंकि वे अब MySQL के वर्तमान संस्करण का संदर्भ नहीं देते हैं।
बुरहान अली


14

मैं सलाह देता हूं कि अगर यह एक विकल्प है तो पोस्टग्रैज। पोस्टग्रेज के साथ निम्न प्रक्रियाओं के साथ अनिवार्य रूप से कोई डाउनटाइम नहीं है:

अन्य महान विशेषता यह है कि अधिकांश डीडीएल स्टेटमेंट ट्रांजेक्शनल हैं, इसलिए आप एक एसक्यूएल लेनदेन के भीतर एक संपूर्ण माइग्रेशन कर सकते हैं, और अगर कुछ गलत हो जाता है, तो पूरी चीज वापस लुढ़क जाती है।

मैंने लिखा यह एक छोटा सा पहले, शायद यह अन्य योग्यता के आधार पर कुछ और अधिक जानकारी बहाया जा सकता है।


6
पोस्टग्रेज अभी भी परिवर्तन पर एक विशेष लॉक बनाता है, दूसरों को उस तालिका से पढ़ने से रोकता है।
घंटाघर

5
मैं "अनिवार्य रूप से कोई डाउनटाइम" बिट से असहमत हूं। जैसा कि क्लॉफ्रेस ने कहा, ALTER TABLE टेबल पर एक एक्सक्लूसिव लॉक पकड़ता है और सभी समवर्ती रीड्स को रोकता है और लिखता है। मेरे अनुभव में, सक्रिय तालिकाओं के लिए ज्यादातर बार आपको लॉक भी नहीं मिलेगा (ALTER TABLE भूखा रह जाएगा)। और लेन-देन के साथ आप आसानी से गतिरोध के साथ समाप्त हो सकते हैं यदि आप बेहद सावधान नहीं हैं। उसके कारण अब मैं हमेशा पोस्टग्रेज में मौजूदा टेबलों में फेरबदल करते हुए डाउनटाइम्स सेट करता हूं।
पँखरत

1
एक अधिक विस्तृत विवरण: dba.stackexchange.com/questions/27153/… इसमें विशेष ताला के निहितार्थ का उल्लेख है, और इसके चारों ओर काम करने के कुछ तरीके
जॉन Douthat

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

2
@cobbzilla हाँ, DROP COLUMN उतनी ही तेज़ है। हुड के तहत यह मूल रूप से क्या करता है कॉलम को छिपे हुए के रूप में चिह्नित करें। उस स्तंभ में मौजूद मानों को गिराए जाने से पहले डेटा फ़ाइलों (और अन्य लेनदेन के लिए दृश्यमान) में अभी भी हैं, और तब तक रहेंगे जब तक कि आप VACUUM FULL नहीं करते।
नूह येटर

7

चूंकि आपने अन्य डेटाबेस के बारे में पूछा है, यहाँ ओरेकल के बारे में कुछ जानकारी दी गई है।

Oracle तालिका में NULL कॉलम जोड़ना एक बहुत ही त्वरित ऑपरेशन है क्योंकि यह केवल डेटा शब्दकोश को अपडेट करता है। यह बहुत कम समय के लिए मेज पर एक अनन्य ताला रखता है। हालाँकि, यह किसी भी डिपेंडेंट स्टोर की गई प्रक्रियाओं, विचारों, ट्रिगर आदि को अमान्य कर देगा। ये स्वतः ही पुनः प्राप्त हो जाएंगे।

यदि आवश्यक हो तो वहां से आप ONLINE क्लॉज का उपयोग करके इंडेक्स बना सकते हैं। फिर से, केवल बहुत कम डेटा शब्दकोश ताले। यह पूरी तालिका को चीजों को अनुक्रमणिका की तलाश में पढ़ेगा, लेकिन ऐसा करते समय किसी को ब्लॉक नहीं करता है।

यदि आपको एक विदेशी कुंजी जोड़ने की आवश्यकता है, तो आप ऐसा कर सकते हैं और Oracle को विश्वास दिला सकते हैं कि डेटा सही है। अन्यथा इसे पूरी तालिका को पढ़ने और उन सभी मूल्यों को मान्य करने की आवश्यकता है जो धीमा हो सकते हैं (पहले अपना सूचकांक बनाएं)।

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

वहां से, आप अपने एप्लिकेशन सर्वर पर कोड के नए संस्करण में एक switcharoo कर सकते हैं और यह चालू रहेगा। अपने डरपोक ट्रिगर ड्रॉप।

वैकल्पिक रूप से, आप DBMS_REDEFINITION का उपयोग कर सकते हैं जो इस तरह की चीज़ करने के लिए डिज़ाइन किया गया एक ब्लैक बॉक्स है।

यह सब परीक्षण करने के लिए बहुत परेशान है, आदि जब भी हम एक प्रमुख संस्करण जारी करते हैं तो बस रविवार की सुबह की शुरुआत होती है।


3

यदि आप एप्लिकेशन अपडेट करते समय अपने डेटाबेस के लिए डाउनटाइम नहीं दे सकते हैं तो आपको उच्च उपलब्धता के लिए दो-नोड क्लस्टर बनाए रखने पर विचार करना चाहिए। एक साधारण प्रतिकृति सेटअप के साथ, आप अपने सुझाव के अनुसार लगभग पूरी तरह से ऑनलाइन संरचनात्मक परिवर्तन कर सकते हैं:

  • निष्क्रिय दास पर सभी परिवर्तनों की प्रतीक्षा करें
  • सक्रिय स्वामी होने के लिए निष्क्रिय दास बदलें
  • पुराने गुरु के संरचनात्मक परिवर्तन करें
  • नए मास्टर से पुराने मास्टर में परिवर्तन को दोहराएं
  • फिर से मास्टर स्वैपिंग और नए ऐप की तैनाती एक साथ करें

यह हमेशा आसान नहीं होता है लेकिन यह काम करता है, आमतौर पर 0 डाउनटाइम के साथ! दूसरे नोड में केवल निष्क्रिय एक होना जरूरी नहीं है, इसका उपयोग परीक्षण के लिए किया जा सकता है, आंकड़े कर सकते हैं या एक कमबैक नोड के रूप में किया जा सकता है। यदि आपके पास बुनियादी ढांचा प्रतिकृति नहीं है, तो एक मशीन के भीतर (MySQL के दो उदाहरणों के साथ) सेट किया जा सकता है।


1
पुराना मास्टर क्लस्टर से बाहर है या क्लस्टर के भीतर है?
जॉन चोर्नेलियस

2

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

यह इतना बड़ा परिवर्तन है कि मुझे संदेह है कि कोई भी डीबीएमएस इसका समर्थन करेगा। यह पहली जगह में तालिका में डेटा के साथ करने में सक्षम होने के लिए एक लाभ माना जाता है।


InnoDB पंक्ति तालों का उपयोग करता है - dev.mysql.com/doc/refman/5.0/en/internal-locking.html
एरन गैल्परिन

हाँ, MySQL विपथन है। इसलिए मैं "मानक" तालिकाओं के बारे में विशिष्ट था।
dkretz

आपने लिखा है - मानक MySQL टेबल केवल टेबल लॉक करते हैं - जो गलत है।
एरन गैल्परिन

आपके द्वारा उद्धृत पृष्ठ से MyISAM (यानी MySQL मानक) तालिकाओं के बारे में आप इसकी व्याख्या कैसे करते हैं? "MySQL में MyISAM और MEMORY टेबल के लिए टेबल-लेवल लॉकिंग, BDB टेबल के लिए पेज-लेवल लॉकिंग और InnoDB टेबल के लिए रो-लेवल लॉकिंग का उपयोग किया जाता है।"
dkretz

कुछ भंडारण इंजन पंक्ति स्तर लॉकिंग का उपयोग करते हैं, और कुछ तालिका स्तर लॉकिंग का उपयोग करते हैं। कोई मानक भंडारण इंजन नहीं है (हो सकता है कि आपका मतलब phpMyAdmin में हो ...)
Eran Galperin

2

अस्थायी समाधान...

अन्य समाधान हो सकता है, अपने नए कॉलम के साथ मूल तालिका की प्राथमिक कुंजी के साथ एक और तालिका जोड़ें।

अपनी प्राथमिक कुंजी को नई तालिका पर पॉप्युलेट करें और अपनी नई तालिका में नए कॉलम के लिए मानों को पॉप्युलेट करें और चुनिंदा परिचालनों के लिए इस तालिका में शामिल होने के लिए अपनी क्वेरी को संशोधित करें और आपको इस कॉलम मान के लिए अलग से अपडेट करने की आवश्यकता है।

जब आप डाउनटाइम प्राप्त करने में सक्षम होते हैं, तो आप मूल तालिका को बदल सकते हैं, अपने डीएमएल प्रश्नों को संशोधित कर सकते हैं और पहले बनाई गई अपनी नई तालिका को छोड़ सकते हैं

इसके अलावा, आप क्लस्टरिंग विधि, प्रतिकृति, पर्टो से पीटी-ऑनलाइन-स्कीमा टूल के लिए जा सकते हैं


1

Innodb प्लगइन का उपयोग करके, ALTER TABLE स्टेटमेंट जो केवल सेकेंडरी इंडेक्स को जोड़ते या छोड़ते हैं, को "जल्दी से" किया जा सकता है, अर्थात टेबल को फिर से बनाए बिना।

आम तौर पर हालांकि, MySQL में, किसी भी तालिका में संपूर्ण तालिका का पुनर्निर्माण शामिल होता है, जिसमें बहुत लंबा समय लग सकता है (यानी यदि तालिका में उपयोगी डेटा है)।

आपको वास्तव में अपना एप्लिकेशन डिज़ाइन करने की आवश्यकता है ताकि ALTER TABLE स्टेटमेंट को नियमित रूप से करने की आवश्यकता न हो; जब तक आप प्रतीक्षा करने के लिए तैयार नहीं होते हैं या आप छोटे तालिकाओं को बदल रहे हैं, आप निश्चित रूप से आवेदन के सामान्य चलने के दौरान कोई भी कार्य नहीं करना चाहते हैं।


1

मैं दो दृष्टिकोणों में से एक की सिफारिश करूंगा:

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

  2. सिस्टम रखरखाव समय है। या तो सिस्टम परिवर्तनों (मासिक, आदि) के दौरान ऑफ़लाइन हो जाता है, और परिवर्तन दिन के कम से कम भारी ट्रैफ़िक समय (3-5am, उदाहरण के लिए) के दौरान निर्धारित किए जाते हैं। उत्पादन रोलआउट से पहले परिवर्तनों का मंचन किया जाता है, इसलिए आपके पास डाउनटाइम का एक अच्छा निश्चित विंडो अनुमान होगा।

2 ए। बेमानी सर्वर हैं, ताकि जब सिस्टम डाउनटाइम हो, तो पूरी साइट नीचे न जाए। यह आपको पूरी साइट को नीचे ले जाने के बिना, आपके अपडेट को एक कंपित शैली में "रोल" करने की अनुमति देगा।

विकल्प 2 और 2 ए संभव नहीं हैं; वे केवल बड़े स्थलों / परिचालनों के लिए होते हैं। हालांकि, वे वैध विकल्प हैं, और मैंने यहां प्रस्तुत सभी विकल्पों का व्यक्तिगत रूप से उपयोग किया है।


1

अगर कोई अभी भी इसे पढ़ रहा है या यहाँ आने के लिए होता है, तो यह mongodb जैसे NoSQL डेटाबेस सिस्टम का उपयोग करने का बड़ा लाभ है। मेरे पास एक ही समस्या थी कि टेबल को बदलने के साथ-साथ अतिरिक्त विशेषताओं के लिए कॉलम जोड़ने के लिए या बड़ी पंक्तियों पर अनुक्रमणिका के साथ लाखों पंक्तियों और उच्च लिखने के साथ। यह बहुत लंबे समय के लिए बंद हो जाएगा ताकि LIVE डेटाबेस पर ऐसा करने से हमारे उपयोगकर्ताओं को निराशा हो। छोटी तालिकाओं पर आप इससे दूर हो सकते हैं।

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

बाहर की जाँच: www.mongodb.com


2
MySQL अभी भी कई प्रणालियों में उपयोग किया जाता है, इसलिए यह प्रश्न वास्तव में है कि SQL RDBMS में स्कीमा परिवर्तन कैसे प्राप्त किया जाए, भले ही मैं एक उत्साही NoSQL समर्थक हूं।
एलेक्सी

1

सामान्य तौर पर, उत्तर "नहीं" होने वाला है। आप तालिका की संरचना को बदल रहे हैं, जिसमें संभावित रूप से बहुत सारे अपडेट की आवश्यकता होगी "और मैं निश्चित रूप से इससे सहमत हूं। यदि आप अक्सर ऐसा करने की उम्मीद करते हैं, तो मैं" डमी "कॉलम के विकल्प की पेशकश करूंगा - VIEWइसके बजाय एस का उपयोग करें। SELECTडेटा के लिए तालिकाओं की IIRC, एक दृश्य की परिभाषा को बदलना अपेक्षाकृत हल्का है और एक दृश्य के माध्यम से अप्रत्यक्ष किया जाता है जब क्वेरी योजना संकलित की जाती है। खर्च यह है कि आपको कॉलम को एक नई तालिका में जोड़ना होगा और बनाना होगा। JOINकॉलम में देखें ।

बेशक यह केवल तभी काम करता है जब आप डिलीट और व्हाट्सएप के कैस्केडिंग करने के लिए विदेशी कुंजियों का उपयोग कर सकते हैं। अन्य बोनस यह है कि आप डेटा के संयोजन वाली एक नई तालिका बना सकते हैं और ग्राहक के उपयोग में खलल डाले बिना इसे इंगित कर सकते हैं।

सिर्फ एक विचार।


1

इस संबंध में Postgres और MySQL के बीच का अंतर यह है कि Postgres में यह एक तालिका को फिर से नहीं बनाता है, लेकिन डेटा शब्दकोश को संशोधित करता है जो कि Oracle के समान है। इसलिए, ऑपरेशन तेज है, जबकि इसे अभी भी एक विशेष डीडीएल टेबल लॉक को आवंटित करने की आवश्यकता है जो बहुत कम समय के लिए दूसरों के द्वारा ऊपर कहा गया है।

MySQL में लेनदेन को अवरुद्ध करते हुए ऑपरेशन एक नई तालिका में डेटा कॉपी करेगा, जो कि v। 5.6 से पहले MySQL DBA के लिए मुख्य दर्द रहा है।

अच्छी खबर यह है कि MySQL 5.6 रिलीज के बाद से प्रतिबंध को ज्यादातर हटा दिया गया है और अब आप MYSQL DB की सच्ची शक्ति का आनंद ले सकते हैं।


3
ऐसा लगता है कि आप MySql 5.6 में बदलाव के संदर्भ में लिंक करने की कोशिश कर रहे थे, लेकिन यह काम नहीं किया। कृपया पुन: प्रयास करें।
dg99

1

जैसा कि SeanDowney ने उल्लेख किया है, pt-online-schema-changeजो कि आपने यहां प्रश्न में वर्णित किया है, करने के लिए सबसे अच्छे साधनों में से एक है। मैंने हाल ही में एक लाइव DB पर बहुत सारे स्कीमा परिवर्तन किए और यह बहुत अच्छी तरह से चला गया। आप इसके बारे में मेरे ब्लॉग पोस्ट पर और अधिक पढ़ सकते हैं: http://mrafayaleem.com/2016/02/08/live-mysql-schema-changes-with-percona/


1

आपको कोशिश जरूर करनी चाहिए pt-online-schema-change। मैं कई दासों के साथ AWS RDS पर माइग्रेशन करने के लिए इस टूल का उपयोग कर रहा हूं और इसने मेरे लिए बहुत अच्छा काम किया है। मैंने एक विस्तृत ब्लॉग पोस्ट लिखी कि यह कैसे किया जाए जो आपके लिए सहायक हो।

ब्लॉग: http://mrafayaleem.com/2016/02/08/live-mysql-schema-changes-with-percona/


0

डमी कॉलम एक अच्छा विचार है यदि आप उनके प्रकार की भविष्यवाणी कर सकते हैं (और उन्हें अशक्त बना सकते हैं)। जांचें कि आपका संग्रहण इंजन नल कैसे संभालता है।

यदि आप हवाई अड्डे पर फोन पर पासिंग में एक टेबल के नाम का उल्लेख करते हैं, तो MyISAM सब कुछ लॉक कर देगा। यह सिर्फ ऐसा करता है ...

कहा जा रहा है कि, ताले वास्तव में इतने बड़े सौदे नहीं हैं; जब तक आप प्रत्येक पंक्ति में नए कॉलम के लिए एक डिफ़ॉल्ट मान जोड़ने का प्रयास नहीं कर रहे हैं, लेकिन इसे शून्य के रूप में बैठते हैं, और आपका स्टोरेज इंजन इतना स्मार्ट है कि इसे लिखना न जाए, आपको केवल एक लॉक के साथ ठीक होना चाहिए जो केवल है मेटाडेटा को अपडेट करने के लिए लंबे समय तक आयोजित किया गया। यदि आप एक नया मूल्य लिखने की कोशिश करते हैं, तो ठीक है, आप टोस्ट हैं।


1
मैंने एक InnoDB तालिका में एक पूर्ण स्तंभ जोड़ने की कोशिश की और इसे पूरी तालिका का पुनर्निर्माण करना पड़ा; एक साधारण "मेटाडेटा अद्यतन नहीं" ऑपरेशन।
डेनियल

मुझे लगता है कि जब यह डिज़ाइन किया गया था, तो डेटाबेस में अतिरिक्त, अशक्त, स्तंभों को शामिल करना था, ताकि यदि एक नई सुविधा की आवश्यकता हो तो इसका उपयोग करके शुरू करके नए कॉलम को "जोड़" सकें। यह एक अच्छा नाम नहीं होगा, लेकिन अगर डेटा प्रकार को सही ढंग से चुना गया / भविष्यवाणी की गई तो यह काम करना चाहिए।
19

0

TokuDB कॉलम जोड़ सकते हैं / छोड़ सकते हैं और इंडेक्स "हॉट" जोड़ सकते हैं, तालिका पूरी प्रक्रिया के दौरान उपलब्ध है। यह www.tokutek.com के माध्यम से उपलब्ध है


-6

ज़रुरी नहीं।

आप तालिका की अंतर्निहित संरचना में परिवर्तन कर रहे हैं, आखिरकार, और यह एक ऐसी जानकारी है जो अंतर्निहित प्रणाली के लिए काफी महत्वपूर्ण है। तुम भी (संभावना) डिस्क पर चारों ओर डेटा के बहुत आगे बढ़ रहे हो

यदि आप ऐसा करने की योजना बनाते हैं, तो आप "डमी" कॉलम के साथ तालिका को बेहतर तरीके से तैयार कर सकते हैं जो भविष्य में उपयोग के लिए उपलब्ध हैं।


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