आप अपने डेटाबेस स्कीमा का संस्करण कैसे बनाते हैं? [बन्द है]


128

आप अपनी SQL डेल्टास कैसे तैयार करते हैं? क्या आप मैन्युअल रूप से प्रत्येक स्कीमा बदलने वाली SQL को डेल्टा फ़ोल्डर में सहेजते हैं, या क्या आपके पास किसी प्रकार की स्वचालित भिन्न प्रक्रिया है?

मैं स्रोत कोड के साथ डेटाबेस स्कीमा को संस्करण के लिए सम्मेलनों में रुचि रखता हूं। शायद एक पूर्व-प्रतिबद्ध हुक जो स्कीमा को अलग करता है?

इसके अलावा, डेल्टेपॉल से अलग डेल्टास के लिए क्या विकल्प मौजूद हैं ?

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

इसके अलावा, अगर यह एक फर्क पड़ता है तो संस्करण PHP और MySQL के लिए है। (कोई रूबी समाधान कृपया)।


मैं एक पैच (और एक रोलबैक स्क्रिप्ट) उत्पन्न करने के लिए स्कीमासिंक का उपयोग करता हूं । इन्हें एसवीएन रेपो में जोड़ा जाता है। यह सही नहीं है, लेकिन यह मेरे लिए अच्छा काम करता है। इसके अलावा, स्कीमा परिवर्तन को लागू करना स्कीमासिंक के साथ काफी आसान है
Jay Sidri

यह लिंक खाली दिखाई देता है - क्या यह अभी भी मौजूद है?
जॉकुल

ऐसा लगता है कि यह स्थानांतरित हो गया है: github.com/mmatuson/SchemaSync
Jay Sidri

जवाबों:


61

देख

क्या डेटाबेस संरचना परिवर्तनों के लिए एक संस्करण नियंत्रण प्रणाली है?

मैं SVN में अपने MS SQL डेटाबेस का संस्करण कैसे बनाऊँ?

और जेफ का लेख

संस्करण नियंत्रण के तहत अपना डेटाबेस प्राप्त करें

मुझे आपका दर्द महसूस हो रहा है, और काश एक बेहतर जवाब होता। यह आप के लिए क्या देख रहे थे के करीब हो सकता है।

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

आम तौर पर, मुझे लगता है कि इसका कोई पर्याप्त, स्वीकृत समाधान नहीं है, और मैं इस क्षेत्र में अपना खुद का रोल करता हूं।


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

मुझे लगता है कि मैं अपना खुद का रोल कर रहा हूँ ...;)
एरन गैल्परिन

क्या आपने DBDiff: github.com/DBDiff/DBDiff को आज़माया है ? यह @EranGalperin के लिए जो आप देख रहे हैं उसके लिए एक अच्छा फिट है क्योंकि यह SQL में स्कीमा और डेटा दोनों के लिए स्वचालित माइग्रेशन करता है। प्रकटीकरण मैं इसके पीछे डेवलपर हूँ!
जसदीप खालसा


4

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

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

अधिक जानकारी के लिए विकी पर नज़र डालें: http://www.nextep-softwares.com/wiki

यह वर्तमान में Oracle, MySql और PostgreSql का समर्थन करता है और जावा में है, इसलिए उत्पाद विंडोज़, लिनक्स और मैक पर चलता है।


3

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

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

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

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

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


2

मैं डेल्टास का प्रबंधन नहीं करता। मैं एक मास्टर डेटाबेस में परिवर्तन करता हूं और एक उपकरण है जो मास्टर डेटाबेस पर आधारित XML आधारित बिल्ड स्क्रिप्ट बनाता है।

जब मौजूदा डेटाबेस को अपग्रेड करने का समय आता है, तो मेरे पास एक प्रोग्राम है जो एक नया डेटाबेस और नंगे टेबल बनाने के लिए XML आधारित बिल्ड स्क्रिप्ट का उपयोग करता है। मैं तब पुराने डेटाबेस से डेटा को इंसर्ट INTO x SELECT FROM y का उपयोग करके कॉपी करता हूं और फिर सभी अनुक्रमित, बाधाओं और ट्रिगर को लागू करता हूं।

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

मैं एक बड़ी मात्रा में डेटा के साथ डेटाबेस पर इस समाधान की अनुशंसा नहीं करूंगा, लेकिन मैं नियमित रूप से एक डेटाबेस को अपडेट करता हूं जो 400 तालिकाओं के साथ 1GB से अधिक है।


यह कुछ बोझिल लगता है, खासकर जब कई डेवलपर्स के साथ काम करते हैं। इसके अलावा निर्माण की प्रक्रिया की मांग लग रहा है, और मैं संभव के रूप में सरल होना चाहते हैं।
एरन गैल्परिन

मैं मानता हूं कि इसे सही होने में थोड़ा समय लगा लेकिन अब इसे अपग्रेड करने के लिए लगभग कोई प्रयास नहीं करना है और एक प्रदर्शन करने के लिए भी कम है। इसके अलावा, एक बात मुझे पसंद है कि मैं अंतरिम हॉटफ़िक्स परिवर्तन कर सकता हूं और इसका अपग्रेड प्रक्रिया पर कोई प्रभाव नहीं है। प्रत्येक अपग्रेड एक नया नया DB है।
डारेल मिलर

2

आपने उल्लेख नहीं किया कि आप किस आरडीबीएमएस का उपयोग कर रहे हैं, लेकिन यदि यह एमएस SQL ​​सर्वर है, तो रेड-गेट की एसक्यूएल तुलना वस्तु निर्माण लिपियों के बीच डेल्टा बनाने में हमारे लिए अपरिहार्य है।


1
यह
मैसकल

2

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

इस उपकरण को ब्राज़ील कहा जाता है और अब MIT लाइसेंस के तहत खुला स्रोत है। रूबी रेल आधारित रूबी / रूबी है और रूबी डीबीआई (MySQL, ODBC, Oracle, Postgres, SQLite) का समर्थन करने वाले किसी भी डेटाबेस में परिवर्तन परिनियोजन का समर्थन करता है।

अद्यतन स्क्रिप्ट को संस्करण नियंत्रण में रखने के लिए समर्थन की योजना बनाई गई है।


ब्राजील बहुत अच्छा लग रहा है, बहुत बुरा मैं मुख्य रूप से PHP का उपयोग कर रहा हूँ। कभी सिस्टम पोर्टिंग माना जाता है?
एरन गैल्परिन


1

हम डेटा को एक पोर्टेबल प्रारूप (हमारे टूलकिन का उपयोग करके) में निर्यात कर रहे हैं, फिर इसे एक नए स्कीमा में आयात कर रहे हैं। डेल्टा SQL के लिए कोई ज़रूरत नहीं है। अत्यधिक सिफारिशित।


3
यह पोर्टेबल प्रारूप क्या है? और आप इसे नए स्कीमा में कैसे आयात करते हैं, पिछले संस्करण से केवल अंतर लागू करते हैं?
एरन गैल्परिन

1

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

मुझे लगता है कि आप कुछ MySQL टूल पा सकते हैं, जिसमें फायरबर्ड के लिए फ्लेम्रोबिन की तरह ही लॉगिंग फीचर है।

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

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

मैंने एक अच्छा श्वेत पत्र लिखा कि कैसे मैं यह सब विस्तार से करता हूं। आप यहां से डेमो PHP स्क्रिप्ट के साथ .pdf प्रारूप में पेपर डाउनलोड कर सकते हैं


1

मैंने PHP स्क्रिप्ट का एक सेट भी विकसित किया है जहाँ डेवलपर्स अपनी डेल्टासकल स्क्रिप्ट को एक केंद्रीय भंडार में जमा कर सकते हैं।

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

वेब इंटरफ़ेस कई परियोजनाओं का प्रबंधन करने की अनुमति देता है। यह डेटाबेस "शाखाओं" का भी समर्थन करता है।

आप http://www.gpu-grid.net/deltasql (यदि आप पासवर्ड testdbsync के साथ व्यवस्थापक के रूप में लॉगिन करते हैं) पर आवेदन का परीक्षण कर सकते हैं । आवेदन खुला स्रोत है और यहां डाउनलोड किया जा सकता है: http://sourceforge.net/projects/deltasql

डेल्टासकल का उपयोग स्विट्जरलैंड और भारत में उत्पादक रूप से किया जाता है, और जापान में लोकप्रिय है।


1

कुछ महीने पहले मैंने MySQL स्कीमा के संस्करण के लिए उपकरण खोजा था। मुझे कई उपयोगी उपकरण मिले, जैसे डॉक्ट्रिन माइग्रेशन, आरओआर माइग्रेशन, कुछ टूल्स जावा और पाइथन में लिखे गए।

लेकिन उनमें से कोई भी मेरी आवश्यकताओं को पूरा नहीं करता था।

मेरी आवश्यकताएं:

  1. कोई आवश्यकता नहीं, PHP और MySQL को बाहर करें
  2. कोई स्कीमा कॉन्फ़िगरेशन फ़ाइलें, जैसे स्कीमा। Doctrine में नहीं
  3. कनेक्शन से वर्तमान स्कीमा को पढ़ने और एप्लिकेशन की अन्य स्थापनाओं में समान स्कीमा का प्रतिनिधित्व करने की तुलना में नई माइग्रेशन स्क्रिप्ट बनाने में सक्षम।

मैंने अपना माइग्रेशन टूल लिखना शुरू कर दिया है, और आज मेरे पास बीटा संस्करण है।

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

स्रोत कोड: bitbucket.org/idler/mmp/src अंग्रेजी में अवलोकन: bitbucket.org/idler/mmp/wiki/Home रूसी में अवलोकन: antonoff.info/development/mysql-migration-with-php-project


आपके पास एक नया टूल भी है: DBV: stackoverflow.com/a/13837473/6309
VonC


1

मुझे इस विषय में भी दिलचस्पी है।

Django विकी में इस विषय पर कुछ चर्चाएं हैं ।

दिलचस्प बात यह है, ऐसा लगता है CakePHP स्कीमा वर्ज़निंग है निर्मित बस का उपयोग कर cake schema generateआदेश।


केक के समाधान के बारे में मैंने जो कुछ भी पढ़ा है - वह बहुत ही मूल अर्थों में भिन्न हो रहा है, हालांकि इसकी कोई अलग क्षमता नहीं है, इसलिए यह मेरे लिए किसी काम का नहीं है।
एरन गैल्परिन

1

MySQL के लिए

जब मैं एक नए DB पर उतरता हूं:

सबसे पहले, मैं संरचना की जांच करता हूं:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

स्टैकओवरफ़्लो उपयोगकर्ताओं के लिए धन्यवाद मैं संरचना के अंतर को खोजने के लिए इस त्वरित स्क्रिप्ट को लिख सकता था।

src: https://stackoverflow.com/a/8718572/4457531 और https://stackoverflow.com/a/26328331/4457531

एक दूसरे चरण में, मैं डेटा की जांच करता हूं, तालिका के साथ तालिका mysqldiff। यह थोड़ा पुरातन है लेकिन information_schemaडेटा पर आधारित एक php लूप निश्चित रूप से काम करता है

संस्करण के लिए, मैं उसी तरह का उपयोग करता हूं, लेकिन मैं अलग-अलग परिणामों के साथ एक SQL अपडेट स्क्रिप्ट (अपग्रेड या रोलबैक करने के लिए) को प्रारूपित करता हूं और मैं संस्करण संख्या सम्मेलन का उपयोग करता हूं (कई संशोधनों के साथ संस्करण संख्या एक आईपी पते की तरह दिखती है)

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------

0

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

यहां SQL सर्वर के लिए पूर्ण कार्यान्वयन है (यदि आवश्यक हो तो MySQL के लिए एक ही समाधान विकसित किया जा सकता है): SQL सर्वर डेटाबेस स्कीमा संस्करण कैसे बनाए रखें


मैंने अभी आपका लेख पढ़ा है। क्या आप अभी भी इस का उपयोग करते हैं या आपने तब से ऑफ-द-शेल्फ समाधान जैसे DBUp या ReadyRoll को अपनाया है?
डेविड एटकिन्सन

वर्तमान में, मेरी सभी परियोजनाएं Entity Framework Code-First पर निर्भर हैं और मैं डेटाबेस के संस्करण के लिए अपने माइग्रेशन का उपयोग करता हूं। मेरे पास विरासत परियोजनाओं के एक जोड़े में लेख से समाधान है और मैंने इसे कभी भी प्रतिस्थापित नहीं किया। अन्य परियोजनाओं में मैंने स्कीमा और माइग्रेशन को प्रबंधित करने के लिए Redgate टूल का उपयोग किया।
ज़ोरान होर्वत

महान है कि आप एक Redgate उपयोगकर्ता हैं! यदि आप EF के साथ संयोजन के रूप में Redgate उपकरण का उपयोग करना चाहते हैं, तो यह संभव है: red-gate.com/blog/database-lifecycle-management/…
डेविड एटकिंसन

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

0

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

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

रुचि के आधार पर, अधिक लिखना जारी रखेगा।


2
नमस्ते, एसओ में आपका स्वागत है। यह उत्तर वास्तव में पूर्ण नहीं है, मूल रूप से यह केवल एक लिंक प्रदान करता है। लिंक-केवल उत्तर सबसे अच्छे नहीं हैं: लिंक को कभी भी अमान्य होना चाहिए, आपका उत्तर बेकार हो जाएगा। इसलिए कृपया इसे संपादित करें और वहां जो भी पाया जा सकता है उसका कम से कम सारांश जोड़ें, ताकि आपके उत्तर में लिंक के स्वतंत्र रूप से एक मूल्य हो। धन्यवाद!
फैबियो का कहना है कि मोनिका
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.