oracle यवस आप उत्पादन डेटाबेस में स्कीमा अपग्रेड कैसे प्रबंधित करते हैं?




हिंदी में डेटाबेस डिजाइन की प्रक्रिया (7)

यह एक अनदेखा क्षेत्र प्रतीत होता है जो वास्तव में कुछ अंतर्दृष्टि का उपयोग कर सकता है। इसके लिए आपके सर्वोत्तम अभ्यास क्या हैं:

  • अपग्रेड प्रक्रिया बनाना
  • त्रुटियों के मामले में समर्थन करना
  • सिंकिंग कोड और डेटाबेस परिवर्तन
  • तैनाती से पहले परीक्षण
  • तालिका को संशोधित करने के यांत्रिकी

आदि...


यह एक अच्छा सवाल है। (एक उच्च संभावना है कि यह एक सामान्यीकृत बनाम denormalised डेटाबेस बहस खत्म करने जा रहा है ... जो मैं शुरू करने के लिए नहीं जा रहा हूँ ... ठीक है कुछ इनपुट के लिए।)

मेरे सिर की चीजों के शीर्ष से कुछ कुछ मैंने किया है (जब मेरे पास कुछ और समय होगा या ब्रेक की आवश्यकता होगी तो अधिक जोड़ देगा)

क्लाइंट डिज़ाइन - यह वह जगह है जहां इनलाइन एसक्यूएल (तैयार कथन के साथ भी) की वीबी विधि आपको परेशानी में डाल देती है। आप केवल उन बयानों को ढूंढकर एजीईएस खर्च कर सकते हैं। यदि आप हाइबरनेट की तरह कुछ उपयोग करते हैं और नामित प्रश्नों में जितना अधिक एसक्यूएल डालते हैं तो आपके पास अधिकांश एसक्यूएल के लिए एक ही जगह है (कुछ आईएफ स्टेटमेंट के अंदर एसक्यूएल का परीक्षण करने की कोशिश करने से भी कुछ भी बुरा नहीं है और आप बस "ट्रिगर" IF कथन के लिए आपके परीक्षण में मानदंड)। जब मैं सीधे जेडीबीसी या ओडीबीसी में एसक्यूएल करता हूं तो हाइबरनेट (या अन्य ऑर्म्स ') का उपयोग करने से पहले मैं सभी एसक्यूएल स्टेटमेंट्स को किसी ऑब्जेक्ट के सार्वजनिक फ़ील्ड्स (नामकरण सम्मेलन के साथ) या किसी प्रॉपर्टी फ़ाइल में रखता हूं (नामकरण के साथ मानों के लिए सम्मेलन PREP_STMT_xxxx कहता है। और किसी भी में स्टार्टअप पर मूल्यों पर प्रतिबिंब या पुनरावृत्ति का उपयोग करें) परीक्षण मामलों बी) आवेदन की स्टार्टअप (कुछ rdbms आपको निष्पादन से पहले तैयार बयानों के साथ पूर्व-संकलन करने की अनुमति देते हैं, इसलिए स्टार्टअप पोस्ट लॉगिन I पर एप्लिकेशन स्वयं परीक्षण करने के लिए स्टार्टअप पर प्री-स्टैम्स को पूर्व-संकलित करेगा। यहां तक ​​कि केवल कुछ सेकंड्स के लिए एक अच्छा rdbms पर 100 के बयानों के लिए। और केवल एक बार। और इसने मेरे बट को बहुत बचा लिया है। एक परियोजना पर डीबीए संवाद नहीं करेगा (एक अलग देश में, एक अलग देश में) और स्कीमा किसी भी कारण से रात में बदलना प्रतीत होता था। और हर सुबह हमें स्टार्टअप पर एप्लिकेशन को तोड़ने के बिल्कुल सटीक सूची मिली।

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

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

मैं आमतौर पर एक टेबल भी सेट करता हूं जिसका उपयोग मैं system_setting आदि कहलाता हूं। इस तालिका में हम एक संस्करण पहचानकर्ता रखते हैं। ऐसा इसलिए है कि क्लाइंट लाइब्रेरी कनेक्शन और सत्यापन कर सकते हैं अगर वे स्कीमा के इस संस्करण के लिए मान्य हैं। आपकी स्कीमा में हुए बदलावों के आधार पर, आप क्लाइंट को कनेक्ट करने की अनुमति नहीं देना चाहते हैं अगर वे आपकी स्कीमा को दूषित कर सकते हैं (यानी आपके पास डीबी में बहुत सारे रेफरेंसियल नियम नहीं हैं, लेकिन क्लाइंट पर)। यह निर्भर करता है कि यदि आपके पास एकाधिक क्लाइंट संस्करण भी होंगे (जो गैर-वेब ऐप्स में होता है, यानी वे गलत बाइनरी चला रहे हैं)। आपके पास बैच टूल्स इत्यादि भी हो सकते हैं। मैंने जो भी दृष्टिकोण किया है, वह किसी प्रकार की प्रॉपर्टी फ़ाइल में या फिर system_info तालिका में ऑपरेशन संस्करणों के लिए स्कीमा का एक सेट परिभाषित करता है। यह तालिका लॉगिन पर लोड की जाती है, और उसके बाद प्रत्येक ऑपरेशन के लिए मान्य होने के लिए प्रत्येक "प्रबंधक" (आमतौर पर अधिकांश डीबी सामान करने के लिए क्लाइंट साइड एपीआई होता है) द्वारा उपयोग किया जाता है, यदि यह सही संस्करण है। इस प्रकार अधिकांश ऑपरेशन सफल हो सकते हैं, लेकिन आप पुराने तरीके से असफल हो सकते हैं (कुछ अपवाद फेंक सकते हैं) और आपको बताते हैं कि क्यों।

स्कीमा में परिवर्तन का प्रबंधन -> क्या आप तालिका को अद्यतन करते हैं या नई तालिकाओं में 1-1 संबंध जोड़ते हैं? मैंने कई दुकानों को देखा है जो इस कारण से हमेशा एक दृश्य के माध्यम से डेटा तक पहुंचते हैं। यह टेबल नामों को बदलने, कॉलम इत्यादि की अनुमति देता है। मैंने वास्तव में COM में इंटरफेस जैसे विचारों का इलाज करने के विचार के साथ खेला है। अर्थात। आप नई कार्यक्षमता / संस्करणों के लिए एक नया दृश्य जोड़ते हैं। अक्सर, आपको यहां क्या मिलता है कि आप बहुत सारी रिपोर्ट (विशेष रूप से अंतिम उपयोगकर्ता कस्टम रिपोर्ट) प्राप्त कर सकते हैं जो तालिका स्वरूप मानते हैं। विचार आपको एक नया टेबल प्रारूप तैनात करने की अनुमति देते हैं लेकिन मौजूदा क्लाइंट ऐप्स का समर्थन करते हैं (उन सभी अजीब adhoc रिपोर्ट याद रखें)।

इसके अलावा, अद्यतन और रोलबैक स्क्रिप्ट लिखने की जरूरत है। और फिर परीक्षा, परीक्षा, परीक्षा ...

------------ ठीक है - यह एक बिट रैंडम डिसस्क्यूशन समय है --------------

असल में एक बड़ी वाणिज्यिक परियोजना (यानी सॉफ्टवेयर शॉप) थी जहां हमें एक ही समस्या थी। आर्किटेक्चर एक 2 स्तर था और वे एक उत्पाद का उपयोग PHP की तरह थोड़ा लेकिन प्री-पीएचपी कर रहे थे। वही चीज। अलग नाम वैसे भी मैं संस्करण 2 में आया था ....

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

और यह नई सुविधाओं को जोड़ने या कोड अनुकूलित करने के इच्छुक होने के बिंदु पर पहुंच रहा था। मौजूदा कोड में से कुछ मौजूदा संग्रहित प्रक्रियाओं का इस्तेमाल करते थे, इसलिए हमारे पास सामान्य बिंदु थे जहां हम कोड प्रबंधित कर सकते थे। लेकिन अन्य क्षेत्रों में एचटीएमएल में इस एम्बेडेड एसक्यूएल मार्कअप थे। जो बाजार में तेजी से आने के लिए बहुत अच्छा था, लेकिन नई सुविधाओं के प्रत्येक बातचीत के साथ कम से कम दोगुना परीक्षण और रखरखाव करने के लिए दोगुना हो गया। तो जब हम php टाइप कोड को बाहर खींच रहे थे, डेटा परतों में डाल रहे थे (यह 2001-2002 था, किसी भी ओआरएम के पूर्व आदि) और बहुत सी नई विशेषताएं (ग्राहक प्रतिक्रिया) जोड़कर UPGRADES को इंजीनियर करने के इस मुद्दे को देखा गया प्रणाली में जो एक बड़ा सौदा है, क्योंकि उन्नयन के लिए सही ढंग से करने के लिए बहुत पैसा खर्च होता है। अब, अधिकांश पैटर्न और अन्य सभी चीजें लोग चल रहे ओओ कोड के साथ ऊर्जा सौदों की एक डिग्री के साथ चर्चा करते हैं, लेकिन इस तथ्य के बारे में क्या है कि आपके डेटा को ए) को एकीकृत करना है, बी) अर्थ और संरचना डेटा समय के साथ बदल सकता है, और अक्सर डेटा काम करने के तरीके के कारण आप अपने क्लाइंट संगठन में बहुत से उप प्रक्रिया / अनुप्रयोगों के साथ समाप्त होते हैं, जिन्हें उस डेटा की आवश्यकता होती है -> विज्ञापन रिपोर्टिंग या किसी जटिल कस्टम रिपोर्टिंग के साथ-साथ बैच जॉब्स जो कस्टम डेटा फ़ीड्स इत्यादि के लिए किए गए हैं।

इस बात को ध्यान में रखते हुए मैंने मैदान के कुछ बाएं हिस्से के साथ खेलना शुरू कर दिया। इसमें कुछ धारणाएं भी हैं। ए) डेटा लिखने से ज्यादा पढ़ा जाता है। बी) अद्यतन होते हैं, लेकिन बैंक स्तर पर नहीं। एक या 2 एक सेकंड कहते हैं।

विचार COMC इंटरफ़ेस दृश्य को लागू करना था कि ग्राहकों द्वारा डेटा को कंक्रीट टेबल (जो स्कीमा परिवर्तनों के साथ भिन्न) पर सेट किया गया था। आप प्रत्येक प्रकार के ऑपरेशन के लिए एक अलग दृश्य बना सकते हैं - अद्यतन, हटाएं, डालें और पढ़ें। यह महत्वपूर्ण है। विचार या तो सीधे एक टेबल पर मैप करेंगे, या आपको एक डमी टेबल को ट्रिगर करने की अनुमति मिलती है जो वास्तविक अपडेट या आवेषण इत्यादि करता है। जो मैं वास्तव में चाहता था वह कुछ प्रकार का ट्रैपबल स्तर संकेत था जिसे अभी भी क्रिस्टल रिपोर्ट आदि द्वारा उपयोग किया जा सकता है। नोट - आवेषण, अद्यतन और हटाए जाने के लिए आप संग्रहीत प्रोसेस का भी उपयोग कर सकते हैं। और आपके पास उत्पाद के प्रत्येक संस्करण के लिए एक संस्करण था। इस तरह आपके संस्करण 1.0 में स्कीमा का संस्करण था, और यदि टेबल बदल गए, तो आपके पास अभी भी संस्करण 1.0 दृश्य होंगे लेकिन नए बैकएंड तर्क के साथ आवश्यकतानुसार नई तालिकाओं को मैप करने के लिए, लेकिन आपके पास संस्करण 2.0 दृश्य भी होंगे जो समर्थन करेंगे नए फ़ील्ड इत्यादि। यह वास्तव में केवल विज्ञापन रिपोर्टिंग का समर्थन करने के लिए था, जो कि यदि आपका व्यवसाय व्यक्ति है और कोडर नहीं है तो शायद आपके पास उत्पाद क्यों है इसका पूरा बिंदु है। (आपका उत्पाद बकवास हो सकता है लेकिन यदि आपके पास दुनिया में सबसे अच्छी रिपोर्टिंग है तो भी आप जीत सकते हैं, रिवर्स सत्य है - आपका उत्पाद सबसे अच्छी सुविधा हो सकता है, लेकिन यदि रिपोर्टिंग पर इससे भी बदतर आप आसानी से ढीला हो सकते हैं)।

ठीक है, उम्मीद है कि उनमें से कुछ विचार मदद करते हैं।


liquibase.org:

  1. यह हाइबरनेट परिभाषाओं को समझता है।
  2. यह हाइबरनेट की तुलना में बेहतर स्कीमा अद्यतन एसक्यूएल उत्पन्न करता है
  3. यह लॉग करता है कि डेटाबेस में कौन से उन्नयन किए गए हैं
  4. यह दो-चरणीय परिवर्तनों को संभालता है (यानी कॉलम "foo" हटाएं और फिर "foo" पर एक अलग कॉलम का नाम बदलें)
  5. यह सशर्त उन्नयन की अवधारणा को संभालता है
  6. डेवलपर वास्तव में समुदाय को सुनता है (हाइबरनेट के साथ यदि आप "इन" भीड़ में नहीं हैं या नौसिखिया हैं - आपको मूल रूप से अनदेखा किया जाता है।)

http://www.liquibase.org


आम तौर पर मेरा नियम है: "एप्लिकेशन को अपनी खुद की स्कीमा का प्रबंधन करना चाहिए।"

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

टेबल संरचनाओं का प्रबंधन करने के लिए मुझे हाइबरनेट्स स्कीमा अपडेट सुविधा का उपयोग करके बहुत सफलता मिली है। अपग्रेड स्क्रिप्ट को केवल वास्तविक डेटा प्रारंभिकता को संभालने और कॉलम को कभी-कभी हटाने के लिए छोड़कर (SchemaUpdate ऐसा नहीं करता है)।

परीक्षण के संबंध में, चूंकि अपग्रेड एप्लिकेशन का हिस्सा हैं, इसलिए उनका परीक्षण परीक्षण के लिए परीक्षण चक्र का हिस्सा बन जाता है।

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


ये सभी भारी विषय हैं, लेकिन अद्यतन करने के लिए मेरी सिफारिश यहां दी गई है।

आपने अपना प्लेटफ़ॉर्म निर्दिष्ट नहीं किया है, लेकिन एनएएनटी वातावरण बनाने के लिए मैं Tarantino उपयोग करता हूं। प्रत्येक डेटाबेस अद्यतन के लिए आप प्रतिबद्ध करने के लिए तैयार हैं, आप एक परिवर्तन स्क्रिप्ट (RedGate या किसी अन्य उपकरण का उपयोग कर) बनाते हैं। जब आप उत्पादन में निर्माण करते हैं, तो टैरेंटिनो जांचता है कि डेटाबेस पर स्क्रिप्ट चलाया गया है (यह ट्रैक रखने के लिए आपके डेटाबेस में एक टेबल जोड़ता है)। यदि नहीं, तो स्क्रिप्ट चलाया जाता है। डेटाबेस संस्करणों के प्रबंधन से यह सभी मैन्युअल कार्य (पढ़ें: मानव त्रुटि) लेता है।


मैं रेड गेट उत्पादों का एक बड़ा प्रशंसक हूं जो डेटाबेस स्कीमा अपडेट करने के लिए SQL पैकेज बनाने में मदद करता है। वर्जनिंग और रोलबैक के साथ मदद करने के लिए डेटाबेस स्क्रिप्ट को स्रोत नियंत्रण में जोड़ा जा सकता है।


जैसा कि पैट ने कहा, तरल पदार्थ का प्रयोग करें। खासकर जब आपके पास अपने स्वयं के देव डेटाबेस के साथ कई डेवलपर हैं जो परिवर्तन कर रहे हैं जो उत्पादन डेटाबेस का हिस्सा बन जाएगा।

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

लेकिन उस से तरल पदार्थ बेहतर संगठित है!


राय

एप्लिकेशन को कभी स्कीमा अपडेट को संभालना नहीं चाहिए। यह एक आपदा होने का इंतजार कर रहा है। डेटा अनुप्रयोगों को आगे बढ़ाता है और जैसे ही कई एप्लिकेशन एक ही डेटा (उत्पादन एप + उदाहरण के लिए एक रिपोर्टिंग ऐप) के साथ काम करने का प्रयास करते हैं - संभावना है कि वे दोनों एक ही अंतर्निहित कंपनी पुस्तकालयों का उपयोग करेंगे ... और फिर दोनों प्रोग्राम निर्णय लेते हैं अपने स्वयं के डीबी अपग्रेड करें ... उस गड़बड़ी के साथ मज़ा लें।





database-administration