DB स्कीमा परिवर्तन पर नज़र रखने के लिए तंत्र [बंद]


135

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

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

जबकि एक समाधान जो कई प्लेटफार्मों का समर्थन करता है, बेहतर होगा, हमें निश्चित रूप से लिनक्स / अपाचे / MySQL / PHP स्टैक का समर्थन करने की आवश्यकता है क्योंकि हमारा अधिकांश काम उस प्लेटफॉर्म पर है।

जवाबों:


56

रेल की दुनिया में, माइग्रेशन की अवधारणा है, स्क्रिप्ट जिसमें डेटाबेस में परिवर्तन SQL के डेटाबेस-विशिष्ट स्वाद के बजाय रूबी में किए गए हैं। आपके रूबी माइग्रेशन कोड को आपके वर्तमान डेटाबेस के लिए DDL में परिवर्तित किया जा रहा है; यह डेटाबेस प्लेटफार्मों को बदलना बहुत आसान बनाता है।

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

यह Oracle गाइड टू रैल माइग्रेशन माइग्रेशन को काफी अच्छी तरह से कवर करता है।

अन्य भाषाओं का उपयोग करने वाले डेवलपर्स ने पलायन को देखा है और अपने स्वयं के भाषा-विशिष्ट संस्करणों को लागू किया है। मैं Ruckuse के बारे में जानता हूँ , एक PHP माइग्रेशन सिस्टम जो Rails के माइग्रेशन के बाद मॉडलिंग की जाती है; यह वही हो सकता है जो आप खोज रहे हैं।


1
Ruckusing FTW - हमने इसे अपने db सिस्टम के लिए अनुकूलित किया और इससे काफी खुश हैं।
पिस्कवर

यह अब github पर स्थित है: github.com/ruckus/ruckuse-migrations

50

हम अपने डेटाबेस स्कीमाटा को 5 अलग-अलग इंस्टॉलेशन (उत्पादन, स्टेजिंग और कुछ डेवलपमेंट इंस्टॉलेशन) में सिंक्रनाइज़ रखने के लिए bcwoord के समान कुछ का उपयोग करते हैं, और संस्करण नियंत्रण में बैकअप लेते हैं, और यह बहुत अच्छी तरह से काम करता है। मैं थोड़ा विस्तार करूँगा:


डेटाबेस संरचना को सिंक्रनाइज़ करने के लिए, हमारे पास एक स्क्रिप्ट, अपडेट। एफपी, और कई फाइलें हैं जिनकी संख्या 1.sql, 2.sql, 3.sql, इत्यादि है। स्क्रिप्ट वर्तमान संस्करण संख्या को संग्रहीत करने के लिए एक अतिरिक्त तालिका का उपयोग करती है। डेटाबेस। N.sql फाइलें हाथ से तैयार की जाती हैं, संस्करण (N-1) से डेटाबेस के संस्करण N तक जाने के लिए।

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

अद्यतन स्क्रिप्ट इस तरह काम करती है:

  • डेटाबेस से कनेक्ट करें।
  • वर्तमान डेटाबेस का बैकअप लें (क्योंकि सामान गलत हो जाएगा ) [mysqldump]।
  • यदि यह मौजूद नहीं है तो बहीखाता तालिका (जिसे _meta कहा जाता है) बनाएं।
  • _Meta तालिका से वर्तमान संस्करण पढ़ें। न मिलने पर 0 मान लें।
  • सभी .sql फ़ाइलों के लिए VERSION से अधिक संख्याएँ हैं, उन्हें क्रम में निष्पादित करें
  • यदि फ़ाइलों में से एक ने एक त्रुटि उत्पन्न की: बैकअप में वापस रोल करें
  • अन्यथा, बुक की गई तालिका में संस्करण को निष्पादित उच्चतम .sql फ़ाइल के लिए अद्यतन करें।

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

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


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

हालांकि phpMyAdmin से प्रश्नों को चिपकाते समय सावधान रहें! उन उत्पन्न प्रश्नों में आमतौर पर डेटाबेस का नाम शामिल होता है, जो आप निश्चित रूप से नहीं चाहते हैं क्योंकि यह आपकी स्क्रिप्ट को तोड़ देगा! क्रिएट टेबल जैसा कुछ mydbnewtable(...) विफल हो जाएगा यदि सिस्टम पर डेटाबेस को mydb नहीं कहा जाता है। हमने एक पूर्व-टिप्पणी एसवीएन हुक बनाया है mydbजो स्ट्रिंग वाली .sql फ़ाइलों को हटा देगा , जो एक निश्चित संकेत है कि कोई व्यक्ति उचित जाँच के बिना phpMyAdmin से कॉपी / पेस्ट किया गया है।


आप टकराव को कैसे संभालते थे? कई डेवलपर्स डीबी में एक ही तत्व को बदलते हैं, उदाहरण के लिए एक संग्रहीत प्रक्रिया? ऐसा तब हो सकता है जब आप एक ही शाखा पर एक ही काम कर रहे हों, या आपके पास दो विकास लाइनें (दो शाखाएँ) हों
Asaf Mesika

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

12

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

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


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

10

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


10

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

जब आपको कोई अपडेट जारी करने की आवश्यकता होती है, तो आप अपने घटकों को प्रतिबद्ध कर सकते हैं और उत्पाद स्वचालित रूप से पिछले संस्करण से SQL अपग्रेड स्क्रिप्ट उत्पन्न करेगा। बेशक, आप किसी भी 2 संस्करणों से इस एसक्यूएल को उत्पन्न कर सकते हैं।

फिर आपके पास कई विकल्प हैं: आप उन लिपियों को ले जा सकते हैं और उन्हें अपने ऐप कोड के साथ अपने एसवीएन में डाल सकते हैं ताकि यह आपके मौजूदा तंत्र द्वारा तैनात हो जाए। एक अन्य विकल्प नेक्स्टेप के वितरण तंत्र का उपयोग करना है: स्क्रिप्ट को "डिलीवरी पैकेज" (एसक्यूएल स्क्रिप्ट + एक्सएमएल डिस्क्रिप्टर) नामक कुछ में निर्यात किया जाता है, और एक इंस्टॉलर इस पैकेज को समझ सकता है और इसे स्ट्रैकटुरल स्थिरता, निर्भरता सुनिश्चित करते हुए एक लक्ष्य सर्वर पर तैनात कर सकता है। स्थापित संस्करण की जाँच, पंजीकरण आदि

उत्पाद GPL है और यह ग्रहण पर आधारित है इसलिए यह लिनक्स, मैक और विंडोज़ पर चलता है। यह फिलहाल ओरेकल, मैसिकल और पोस्टग्रैस्कल का भी समर्थन करता है (DB2 समर्थन रास्ते में है)। विकी पर एक नज़र डालें जहां आपको अधिक विस्तृत जानकारी मिलेगी: http://www.nextep-softwares.com/wiki


दिलचस्प लग रहा है। क्या इसमें कमांड-लाइन इंटरफ़ेस भी है, या एक योजना है?
पिस्कोर ने बिल्डिंग

8

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

हम कुछ समय से ऐसा कर रहे हैं और यह काम करने लगता है। हमने यूनिट टेस्टिंग सूट में बेसिक कॉलम नाम और डेटाटाइप चेक जेनरेट करने के लिए कोड लिखा था। हम उन परीक्षणों को कभी भी पुन: सत्यापित कर सकते हैं कि SVN चेकआउट में डेटाबेस लाइव db से मेल खाता है जो अनुप्रयोग वास्तव में चल रहा है।

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


7

एक फ़ाइल में अपने स्कीमा को डंप करें और इसे स्रोत नियंत्रण में जोड़ें। फिर एक साधारण अंतर आपको दिखाएगा कि क्या बदल गया है।


1
डंप को SQL में होना चाहिए, जैसे mysqldump, Oracle के डंप बाइनरी हैं।
ओसामा अल-मदीद

7
स्कीमा डिफरिंग के साथ एक और मौलिक समस्या भी है। आप किसी कॉलम का नाम बदलने वाले कॉलम ड्रॉप + को कैसे अलग करते हैं। जवाब आसान है: आप नहीं कर सकते। यही कारण है कि आपको वास्तविक स्कीमा परिवर्तन कार्यों को रिकॉर्ड करने की आवश्यकता है।
पीपी

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

6

के स्कॉट एलन का स्कीमा संस्करण पर एक अच्छा लेख या दो है, जो अन्य उत्तर में संदर्भित वृद्धिशील अद्यतन स्क्रिप्ट / माइग्रेशन अवधारणा का उपयोग करता है; देख http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx


5

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

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

इस स्क्रिप्ट के साथ, आप इसे DBUnit या किसी प्रकार की स्क्रिप्ट के साथ एकीकृत कर सकते हैं, इसलिए ऐसा लगता है कि यह आपके पहले से स्वचालित प्रक्रियाओं के साथ फिट हो सकता है।


हाँ, यह बहुत ज्यादा है जो अभी हमारे पास है। दुर्भाग्य से यह हमें मौजूदा डेटाबेस को संशोधित करने का आसान तरीका नहीं देता है - mysqldump द्वारा उत्पन्न SQL स्क्रिप्ट मानती है कि आप तालिका को खरोंच से बना रहे हैं (या यदि यह मौजूद है तो तालिका को अधिलेखित कर सकते हैं)। हमें कुछ अधिक उच्च तकनीक की आवश्यकता है क्योंकि इसे डेटाबेस में ALTER TABLE कथनों के अनुक्रम को लागू करने की आवश्यकता है, और यह करने के लिए कि डेटाबेस की वर्तमान स्थिति के बारे में ठीक से पता होना चाहिए।
pix0r

5

यदि आप C # का उपयोग कर रहे हैं, तो Subsonic पर एक नज़र डालें, एक बहुत ही उपयोगी ORM उपकरण है, लेकिन आपकी योजना और \ या डेटा को पुनः बनाने के लिए sql स्क्रिप्ट भी बनाता है। फिर इन लिपियों को स्रोत नियंत्रण में रखा जा सकता है।

http://subsonicproject.com/


इस समय के रूप में एक मृत URL माना जाता है।
मार्क शुल्त्स

5

मैंने कई प्रोजेक्ट्स के लिए Visual Studio में निम्न डेटाबेस प्रोजेक्ट संरचना का उपयोग किया है और यह बहुत अच्छी तरह से काम किया है:

डेटाबेस

लिपियों को बदलें

0.PreDeploy.sql

1.SchemaChanges.sql

2.DataChanges.sql

3.Permissions.sql

लिपियों बनाएँ

sprocs

कार्य

दृश्य

हमारी निर्माण प्रणाली तब निम्न क्रम में स्क्रिप्ट को निष्पादित करके डेटाबेस को एक संस्करण से अगले तक अपडेट करती है:

1.PreDeploy.sql

2.SchemaChanges.sql

स्क्रिप्ट बनाएँ फ़ोल्डर की सामग्री

2.DataChanges.sql

3.Permissions.sql

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


5

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

नए इंस्टाल के लिए, हमारे पास रिपॉजिटरी में एक मेटाडेटा.एससीएल फाइल है जो सभी डीबी स्कीमा को रखती है, फिर निर्माण प्रक्रिया में हम डेटाबेस को जेनरेट करने के लिए इस फाइल का उपयोग करते हैं।

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

तो हमारे सॉफ्टवेयर में हमारे पास कुछ इस तरह है:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

यह कोड यह जांच करेगा कि क्या डेटाबेस संस्करण 1 में है (जो स्वचालित रूप से बनाई गई तालिका में संग्रहीत है), यदि यह पुराना है, तो कमांड निष्पादित किया जाता है।

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

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

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


4

मैं बिल्ड संस्करणों के नाम वाले फ़ोल्डर बनाता हूं और वहां अपग्रेड और डाउनग्रेड स्क्रिप्ट डालता हूं। उदाहरण के लिए, आपके पास निम्न फ़ोल्डर हो सकते हैं: 1.0.0, 1.0.1 और 1.0.2। प्रत्येक में वह स्क्रिप्ट होती है जो आपको संस्करणों के बीच अपने डेटाबेस को अपग्रेड या डाउनग्रेड करने की अनुमति देती है।

क्या किसी क्लाइंट या ग्राहक को आपको संस्करण 1.0.1 की समस्या के साथ कॉल करना चाहिए और आप 1.0.2 का उपयोग कर रहे हैं, डेटाबेस को उसके संस्करण में वापस लाना कोई समस्या नहीं होगी।

अपने डेटाबेस में, "स्कीमा" नामक एक तालिका बनाएं जहां आप डेटाबेस के वर्तमान संस्करण में डालते हैं। फिर एक प्रोग्राम लिखना जो आपके डेटाबेस को अपग्रेड या डाउनग्रेड कर सके आपके लिए आसान है।

ठीक वैसे ही जैसे जॉय ने कहा, अगर आप रेल की दुनिया में हैं, तो माइग्रेशन का इस्तेमाल करें। :)


3

मेरे वर्तमान PHP प्रोजेक्ट के लिए हम रेल माइग्रेशन के विचार का उपयोग करते हैं और हमारे पास एक माइग्रेशन डायरेक्टरी है जिसमें हम फाइल का शीर्षक "mig_XX.sql" रखते हैं जहां XX माइग्रेशन की संख्या है। वर्तमान में इन फ़ाइलों को हाथ से बनाया जाता है क्योंकि अपडेट किए जाते हैं, लेकिन उनकी रचना को आसानी से संशोधित किया जा सकता है।

फिर हमारे पास "माइग्रेशन_वॉचर" नामक एक स्क्रिप्ट है, जैसा कि हम पूर्व-अल्फा में हैं, वर्तमान में प्रत्येक पृष्ठ लोड पर चलता है और जांचता है कि क्या कोई नया माइग्रेशन_XX.sql फ़ाइल है जहां XX वर्तमान माइग्रेशन संस्करण से बड़ा है। यदि ऐसा है तो यह डेटाबेस और वॉइला के खिलाफ सबसे बड़ी संख्या तक सभी mig_XX.sql फ़ाइलों को चलाता है! स्कीमा परिवर्तन स्वचालित हैं।

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


3

मैं "स्क्रिप्टिंग" पक्ष के लिए चींटी (क्रॉस प्लेटफॉर्म) का उपयोग करने की सलाह दूंगा (क्योंकि यह व्यावहारिक रूप से jdbc के माध्यम से किसी भी db से बात कर सकता है) और स्रोत रिपॉजिटरी के लिए तोड़फोड़। चींटी परिवर्तन करने से पहले आपको अपने db को स्थानीय फ़ाइलों में "बैकअप" करने के लिए बदल देगी। 1. बैकअप मौजूदा DB स्कीमा चींटी के माध्यम से फाइल करने के लिए। 2. एंट्रो के माध्यम से तोड़फोड़ भंडार के लिए संस्करण नियंत्रण 3. चींटी के माध्यम से DB को नए sql स्टेटमेंट भेजें


3

MySQL के लिए टॉड में स्कीमा नामक एक फ़ंक्शन है जो आपको 2 डेटाबेस को सिंक्रनाइज़ करने की अनुमति देता है। यह अब तक का उपयोग किया गया सबसे अच्छा उपकरण है।


3

मुझे यह पसंद है कि कैसे Yii डेटाबेस माइग्रेशन को संभालता है। एक माइग्रेशन मूल रूप से एक PHP लिपि का कार्यान्वयन है CDbMigrationCDbMigrationएक upविधि को परिभाषित करता है जिसमें माइग्रेशन लॉजिक होता है। downमाइग्रेशन को उलटने का समर्थन करने के लिए एक विधि को लागू करना भी संभव है । वैकल्पिक रूप से, safeUpया safeDownयह सुनिश्चित करने के लिए इस्तेमाल किया जा सकता है कि माइग्रेशन किसी लेनदेन के संदर्भ में किया जाता है।

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

अधिक जानकारी के लिए डेटाबेस माइग्रेशन आलेख मैनुअल से देखें।



2

आईएमएचओ के प्रवास में भारी समस्या है:

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

मौजूदा संस्करण के आधार रेखा (सैकड़ों ग्राहकों के डेटाबेस के लिए) के बाद से डेल्टा के पूरे इतिहास को चलाने में बहुत लंबा समय लग सकता है।


0

एक कमांड लाइन mysql-diff टूल है जो डेटाबेस स्कीमा की तुलना करता है, जहां स्कीमा डिस्क पर एक लाइव डेटाबेस या SQL स्क्रिप्ट हो सकता है। यह सबसे स्कीमा माइग्रेशन कार्यों के लिए अच्छा है।

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