database - क्या आप अपने डेटाबेस आइटम्स के लिए स्रोत नियंत्रण का उपयोग करते हैं?




version-control (20)

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

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

हालांकि, मुझे पता है कि यह कहानी कैसे जाती है। चीजें केवल गलत होने से पहले और कुछ गायब होने से पहले ही समय की बात है।

क्या इसके लिए कोई सर्वोत्तम अभ्यास है? आपके लिए काम करने वाली कुछ रणनीतियों क्या हैं?


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

if [ $VERSION \< '8.0.108' ] ; then
  psql -U cosuser $dbName << EOF8.0.108
    BEGIN TRANSACTION;
    --
    -- Remove foreign key that shouldn't have been there.
    -- PCR:35665
    --
    ALTER TABLE     migratorjobitems
    DROP CONSTRAINT migratorjobitems_destcmaid_fkey;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.108'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.108
fi

if [ $VERSION \< '8.0.109' ] ; then
  psql -U cosuser $dbName << EOF8.0.109
    BEGIN TRANSACTION;
    --
    -- I missed a couple of cases when I changed the legacy playlist
    -- from reporting showplaylistidnum to playlistidnum
    --
    ALTER TABLE     featureidrequestkdcs
    DROP CONSTRAINT featureidrequestkdcs_cosfeatureid_fkey;
    ALTER TABLE     featureidrequestkdcs
    ADD CONSTRAINT  featureidrequestkdcs_cosfeatureid_fkey
    FOREIGN KEY     (cosfeatureid)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    --
    ALTER TABLE     ticket_system_ids
    DROP CONSTRAINT ticket_system_ids_showplaylistidnum_fkey;
    ALTER TABLE     ticket_system_ids
    RENAME          showplaylistidnum
    TO              playlistidnum;
    ALTER TABLE     ticket_system_ids
    ADD CONSTRAINT  ticket_system_ids_playlistidnum_fkey
    FOREIGN KEY     (playlistidnum)
    REFERENCES      playlist(playlistidnum)
    ON DELETE       CASCADE;
    -- 
    -- Increment the version
    UPDATE          sys_info
    SET             value = '8.0.109'
    WHERE           key = 'DB VERSION';
    END TRANSACTION;
EOF8.0.109
fi

मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है, लेकिन यह अब तक मेरे लिए काम करता है।


एक प्रोजेक्ट पर मैंने कभी भी सबसे सफल योजना बनाई है जिसमें बैकअप और अंतर एसक्यूएल फाइलें हैं। असल में हम प्रत्येक रिलीज के बाद हमारे डीबी का बैकअप लेंगे और एक एसक्यूएल डंप करेंगे ताकि अगर हमें भी आवश्यकता हो तो हम स्क्रैच से रिक्त स्कीमा बना सकते हैं। फिर कभी भी आपको डीबी में बदलाव करने की आवश्यकता होती है, तो आप संस्करण नियंत्रण के तहत एसक्यूएल निर्देशिका में एक बदलाव स्क्रिप्ट जोड़ देंगे। हम हमेशा फ़ाइल नाम के अनुक्रम संख्या या दिनांक को उपसर्ग करेंगे, इसलिए पहला परिवर्तन 01_add_created_on_column.sql जैसा होगा, और अगली स्क्रिप्ट 02_added_customers_index होगी। हमारी सीआई मशीन इनके लिए जांच करेगी और बैकअप से बहाल किए गए डीबी की एक ताजा प्रति पर अनुक्रमिक रूप से उन्हें चलाएगी।

हमारे पास कुछ स्क्रिप्ट भी थीं जो देव अपने मौजूदा डीबी को एक ही कमांड के साथ मौजूदा संस्करण में फिर से शुरू करने के लिए उपयोग कर सकते थे।


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

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

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

आप अधिक जानकारी के लिए इस आलेख को पढ़ सकते हैं: http://solutioncenter.apexsql.com/sql-source-control-reduce-database-development-time/


खुद डेटाबेस? नहीं

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

बेशक एक आदर्श दुनिया में आपका डेटाबेस प्रबंधन उपकरण ऐसा करेगा; लेकिन आपको बस इसके बारे में अनुशासित होना है।


पढ़ना चाहिए अपने डेटाबेस को संस्करण नियंत्रण के तहत प्राप्त करें । के स्कॉट एलन द्वारा पोस्ट की श्रृंखला की जांच करें।

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


मेरा मानना ​​है कि प्रत्येक डीबी स्रोत नियंत्रण में होना चाहिए, और डेवलपर्स को अपने स्थानीय डेटाबेस को स्क्रैच से बनाने का एक आसान तरीका होना चाहिए। डेटाबेस पेशेवरों के लिए विजुअल स्टूडियो द्वारा प्रेरित, मैंने एक ओपन-सोर्स टूल बनाया है जो एमएस एसक्यूएल डेटाबेस को स्क्रिप्ट करता है, और उन्हें आपके स्थानीय डीबी इंजन में तैनात करने का आसान तरीका प्रदान करता है। http://dbsourcetools.codeplex.com/ आज़माएं। मजा करो, - नाथन।


मैं MySQL वर्कबेक से निर्यात की गई SQL CREATE स्क्रिप्ट का उपयोग करता हूं, फिर उनके "निर्यात SQL ALTER" कार्यक्षमता का उपयोग करके मैं स्क्रिप्ट (निश्चित रूप से क्रमांकित) की एक श्रृंखला के साथ समाप्त होता हूं और उन परिवर्तनों को बदलता हूं जो उनके बीच परिवर्तन लागू कर सकते हैं।

3.- एसक्यूएल एल्टर स्क्रिप्ट निर्यात करें आम तौर पर आपको मॉडल द्वारा किए गए अपने परिवर्तनों को प्रतिबिंबित करते हुए, अब हाथ से अक्षर तालिका विवरण लिखना होगा। लेकिन आप स्मार्ट हो सकते हैं और वर्कबेंच आपके लिए कड़ी मेहनत कर सकते हैं। बस मुख्य मेनू से फ़ाइल -> निर्यात -> फॉरवर्ड इंजीनियर SQL ALTER स्क्रिप्ट ... का चयन करें।

यह आपको SQL CREATE फ़ाइल को निर्दिष्ट करने के लिए संकेत देगा, वर्तमान मॉडल की तुलना की जानी चाहिए।

चरण 1 से SQL CREATE स्क्रिप्ट का चयन करें। टूल तब आपके लिए ALTER तालिका स्क्रिप्ट जेनरेट करेगा और आप इसे अपने डेटाबेस के विरुद्ध अद्यतित करने के लिए इस स्क्रिप्ट को निष्पादित कर सकते हैं।

आप MySQL क्वेरी ब्राउज़र या MySQL क्लाइंट का उपयोग कर ऐसा कर सकते हैं। वोला! आपका मॉडल और डेटाबेस अब सिंक्रनाइज़ किया गया है!

स्रोत: MySQL वर्कबेंच समुदाय संस्करण: स्कीमा सिंक्रनाइज़ेशन की मार्गदर्शिका

पाठ्यक्रम की सभी स्क्रिप्ट संस्करण नियंत्रण के तहत अंदर हैं।


मैं अपने सभी डेटाबेस स्कीमा परिवर्तनों को संस्करण नियंत्रण में SchemaBank का उपयोग करता हूं:

  • दिन 1 से, मैं इसमें अपना डीबी स्कीमा डंप आयात करता हूं
  • मैंने एक वेब ब्राउजर का उपयोग करके अपना स्कीमा डिज़ाइन बदलना शुरू कर दिया (क्योंकि वे सास / क्लाउड-आधारित हैं)
  • जब मैं अपना डीबी सर्वर अपडेट करना चाहता हूं, तो मैं इसमें से परिवर्तन (एसक्यूएल) स्क्रिप्ट उत्पन्न करता हूं और डीबी पर लागू होता हूं। Schemabank में, वे एक अद्यतन स्क्रिप्ट उत्पन्न करने से पहले मुझे एक संस्करण के रूप में अपना काम करने के लिए जरूरी है। मुझे इस तरह की प्रैक्टिस पसंद है ताकि जब मुझे आवश्यकता हो तो मैं हमेशा पीछे आ सकता हूं।

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

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

संस्करण नियंत्रण एन परिवर्तन प्रबंधन के साथ एक सुंदर साफ वेब आधारित स्कीमा डिजाइन उपकरण।


मैं बिल्कुल Rails ActiveRecord माइग्रेशन प्यार करता हूँ। यह डीएमएल को रूबी स्क्रिप्ट में सारणीबद्ध करता है जिसे आपके स्रोत भंडार में आसानी से संस्करणित किया जा सकता है।

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

रेलों में डीबी में 'संस्करण' तालिका भी होती है जो अंतिम लागू माइग्रेशन का ट्रैक रखती है। आप भी वही कर सकते हैं।


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


मैंने http://dbdeploy.com/ पर ThoughtWorks से dbdeploy टूल का उपयोग किया है। यह माइग्रेशन स्क्रिप्ट के उपयोग को प्रोत्साहित करता है। प्रत्येक रिलीज, हमने समझ को आसान बनाने और डीबीए को परिवर्तनों को 'आशीर्वाद' देने की अनुमति देने के लिए परिवर्तन स्क्रिप्ट को एक फ़ाइल में समेकित किया।


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

मेरा मानना ​​है कि यह NaNt / CruiseControl के साथ किया गया था।


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

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

एक उत्कृष्ट उपकरण। यहां लिंक है: http://www.sqldelta.com/


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

रेडगेट डेटा स्नैपशॉट भी बनाता है, जबकि मैंने व्यक्तिगत रूप से उनके साथ काम नहीं किया है, वे उतने ही मजबूत हैं।


स्रोत नियंत्रण का उपयोग कर डेटाबेस परिवर्तनों के प्रबंधन के लिए LiquiBase देखें।


हम अपने डेटाबेस के आस-पास के संस्करण और स्रोत नियंत्रण सब कुछ:

  • डीडीएल (बनाएं और बदलें)
  • डीएमएल (संदर्भ डेटा, कोड, आदि)
  • डेटा मॉडल में परिवर्तन (ERwin या ER / Studio का उपयोग करके)
  • डेटाबेस कॉन्फ़िगरेशन में परिवर्तन (अनुमतियां, सुरक्षा ऑब्जेक्ट्स, सामान्य कॉन्फ़िगरेशन परिवर्तन)

हम चेंज मैनेजर और कुछ कस्टम स्क्रिप्ट का उपयोग करके स्वचालित नौकरियों के साथ यह सब करते हैं। हमारे पास चेंज मैनेजर इन परिवर्तनों की निगरानी कर रहा है और जब वे किए जाते हैं तो अधिसूचना करते हैं।


हम सभी डेटाबेस को स्रोत नियंत्रण में स्थानांतरित करने की प्रक्रिया में हैं। हम डेटाबेस को स्क्रिप्ट करने के लिए sqlcompare का उपयोग कर रहे हैं (दुर्भाग्यवश एक पेशे संस्करण सुविधा) और परिणामस्वरूप एसवीएन में डाल दिया।

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

आपको शुभकामनाएं, जितनी जल्दी आप इसे जल्द से जल्द कोशिश करेंगे, आपको अपने मुद्दों को हल किया जाएगा।


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

लाइव वातावरण में स्क्रिप्ट चलाने से पहले बहुत सारे परीक्षण किए जाते हैं, इसलिए "ओप्सिस" केवल विकास डेटाबेस पर बोलते हुए होता है।


हाँ। कोड कोड है। अंगूठे का मेरा नियम यह है कि मुझे विकास या उत्पादन मशीन को देखे बिना, एप्लिकेशन को स्क्रैच से बनाने और तैनात करने में सक्षम होना चाहिए


हां, मुझे लगता है कि यह आपके डेटाबेस के संस्करण के लिए महत्वपूर्ण है। डेटा नहीं, लेकिन निश्चित रूप से स्कीमा।

रूबी ऑन रेल में, इसे "माइग्रेशन" के साथ ढांचे द्वारा नियंत्रित किया जाता है। जब भी आप डीबी को बदलते हैं, तो आप एक स्क्रिप्ट बनाते हैं जो परिवर्तनों को लागू करता है और इसे स्रोत नियंत्रण में जांचता है।

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






version-control