आप डेटाबेस परिवर्तन की तैनाती को कैसे संभालते हैं?


13

आज हम डेटाबेस परिनियोजन तकनीकों पर चर्चा कर रहे हैं, हमारी वर्तमान प्रक्रिया में हाल ही में विफलताओं के एक जोड़े थे और उन स्थितियों को देखा है जहां हम एक तैनाती को वापस लेना चाहते हैं लेकिन आवेदन के पुराने संस्करण को कभी भी नए संस्करण के खिलाफ परीक्षण नहीं किया गया था। डेटाबेस।

एक तरफ, माइग्रेशन-शैली की तैनाती होती है, जहां आपके पास एक वर्जन-अप इंस्ट्रक्शन और एक वर्जन-डाउन इंस्ट्रक्शन (चाहे वे SQL में लिखे गए हों या आपकी एप्लिकेशन लैंग्वेज में हों) और आपका एप जानता है कि उसे किस वर्जन की जरूरत है।

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

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

यह डेटा को बरकरार रखता है, लेकिन कोड और परीक्षण दोनों के लिए जटिल है (दुख की बात है, हमारे स्वचालित एकीकरण परीक्षण बहुत अधिक गैर-मौजूद हैं और जब हम इसे सही कर रहे हैं, तो हमें इस बीच समस्या है)।

क्या इनसे होने वाली समस्याओं को कम करने के लिए सुरक्षित तरीके हैं? क्या अन्य विकल्प हैं जिन पर मुझे विचार करना चाहिए? क्या आपके पास बुरे अनुभव हैं जिन्हें आप साझा करना चाहते हैं जो बाद में मुझे दर्द से बचा सकते हैं?

जवाबों:


9

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

SQL सर्वर में आप एक परिनियोजन से ठीक पहले स्नैपशॉट ले सकते हैं और फिर परिनियोजन विफल होने पर तुरंत वापस आ सकते हैं। यह मानता है कि जब उपयोगकर्ता सिस्टम पर होते हैं (आप उनके डेटा परिवर्तन नहीं खोना चाहते हैं) परिनियोजन नहीं हो रहा है। यह एक प्रमुख रिलीज के दौरान सबसे उपयोगी है जब आपको अपग्रेड करने के लिए पूरी प्रणाली को अस्थायी रूप से नीचे ले जाना पड़ सकता है। या आप अभी भी स्नैपशॉट ले सकते हैं और स्नैपशॉट और डेटाबेस के बीच तुलना करने के लिए डेटाबेस की तुलना कर सकते हैं यदि आपको रोलबैक करने की आवश्यकता है। SQLCompare जैसे उपकरण भी स्नैपशॉट संरचना पर वापस जाने के लिए कोड उत्पन्न कर सकते हैं। मुझे नहीं पता कि अन्य डेटाबेस के लिए क्या उपलब्ध है।


3

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

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

परिवर्तन वृद्धिशील रूप से किया जा सकता है (जैसे कि एक फ़ील्ड जोड़ना) और इसलिए परीक्षण किया जाता है कि कम जोखिम के साथ जब वे सभी एक पास में करते हैं।

योजना के साथ, आप प्रत्येक रिलीज़ के साथ सॉफ़्टवेयर और डेटाबेस अपग्रेड का सामना करने के बजाय, कई आगामी रिलीज़ का समर्थन करने के लिए डेटाबेस में बदलाव कर सकते हैं ।

किसी डेटाबेस अपग्रेड के बाद के दिनों में इमरजेंसी मोड में रहने के लिए तैयार रहें , जैसे आप एक सॉफ्टवेयर अपग्रेड थे।

समस्याओं को मैन्युअल रूप से पैच करने के आग्रह का विरोध करें। अपनी आकस्मिक रणनीति (रोलबैक, स्नैपशॉट) का उपयोग करें और फिर सोचें कि नवीनीकरण को फिर से आज़माने से पहले चीजें गलत क्यों हुईं।

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