मैं git (संस्करण नियंत्रण) के तहत एक डेटाबेस कैसे रख सकता हूं?


274

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

मैं उसको कैसे करू? वहाँ एक विशिष्ट फ़ोल्डर है कि मैं एक गिट भंडार के तहत रख सकते हैं? मुझे कैसे पता चलेगा कि कौन सा है मैं कैसे सुनिश्चित कर सकता हूं कि मैं सही फ़ोल्डर डाल रहा हूं?

मुझे निश्चित होने की आवश्यकता है, क्योंकि ये परिवर्तन पिछड़े संगत नहीं हैं; मैं पंगा नहीं ले सकता।

मेरे मामले में डेटाबेस PostgreSQL है

संपादित करें:

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

कोई बेहतर तरीका ज़रूर होगा।

अपडेट करें:

ठीक है, इसलिए कोई बेहतर तरीका नहीं है, लेकिन मैं अभी भी बहुत आश्वस्त नहीं हूं, इसलिए मैं सवाल को थोड़ा बदल दूंगा:

मैं संपूर्ण डेटाबेस को संस्करण नियंत्रण में रखना चाहूंगा, मैं किस डेटाबेस इंजन का उपयोग कर सकता हूं ताकि मैं वास्तविक डेटाबेस को इसके डंप के बजाय संस्करण नियंत्रण में रख सकूं?

क्या sqlite git-friendly होगा?

चूंकि यह केवल विकास का माहौल है, मैं जो भी डेटाबेस चाहता हूं उसे चुन सकता हूं।

EDIT2:

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


5
ईमानदार होने के लिए, मैं बस डेटाबेस की प्रतियां बनाता हूं अगर मैं स्कीमा परिवर्तन शुरू कर रहा हूं और एक ही समय में कई विकास शाखाओं से निपटना है ... देव डेटाबेस को उम्मीद है कि ऐसा करने के लिए पर्याप्त छोटा होना चाहिए। मुझे लगता है कि चतुर होने की कोशिश करने वाली किसी भी प्रणाली के बारे में मैं सिर्फ इसलिए संदेह के साथ स्रोत शाखा को बदल देता हूं। और मैं यह भी सुनिश्चित करना चाहूंगा कि अगर मैं बस अपने कार्यक्षेत्र का क्लोन बनाऊं और एक स्थान पर एक शाखा, और दूसरे में नया काम करूं तो मुझे काम पर रखना होगा।
आराकनिद


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

1
एक सॉफ्टवेयर के लिए मेरे जवाब को चेक करें जो वास्तव में ऐसा करता है: stackoverflow.com/a/28123546/1662984
केविन

जवाबों:


140

इसके बजाय एक डेटाबेस डंप, और संस्करण नियंत्रण लें। इस तरह यह एक फ्लैट टेक्स्ट फाइल है।

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

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


132
क्या? वहाँ एक बेहतर तरीका होगा।
hasen

18
PostGreSQL डेटाबेस फाइलें बाइनरी फाइलें हैं, उन्हें अपने गिट रिपॉजिटरी में डालने के लिए स्वतंत्र महसूस करें, आप बस उन पर कोई भी अंतर नहीं कर पाएंगे, और कोई भी बदलाव पूरे डेटाबेस को बदलने की संभावना है और इस प्रकार अब आपको पूर्ण भेजना होगा आपके git रेपो में वायर पर डेटाबेस और इसे स्टोर करें। यह अक्षम, धीमा है, और इसके साथ काम करने में बेहद कठिन है। इसके अलावा, मुझे यकीन नहीं है कि VACUUM के बिना डिस्क पर संग्रहीत डेटाबेस फाइलें और प्रतिलिपि बनाने के लिए PostgreSQL को बंद करने के लिए "स्थिर" हैं क्योंकि सभी डेटा हमेशा सही होते हैं, जिससे संभवतः भ्रष्ट डेटा के साथ आपको छोड़ दिया जाता है।
X-Istence

6
ओह, अच्छा! खैर, क्या db सिस्टम अधिक git-friendly हैं?
hasen

16
समाधान के इस प्रकार के सुंदर मानक है और स्कीमा है वास्तव में स्रोत कोड।
द साने

12
यह 2017 है, इस सवाल पर कोई अपडेट? क्या वास्तव में बॉक्स से कोई DB संस्करण नियंत्रण नहीं है? वास्तव में ?
Stavm

48

कोड परिवर्तन के साथ अग्रानुक्रम में अपने डेटाबेस को बनाए रखने के लिए अच्छी तकनीकों के एक समूह के लिए रिफैक्टरिंग डेटाबेस ( http://databaserefactoring.com/ ) देखें।

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

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


2
मुझे databaserefactoring साइट पर प्रासंगिक जानकारी नहीं मिली ... यह DB कोड के लिए विभिन्न रीफैक्टरिंग तकनीकों को सूचीबद्ध करने के लिए प्रतीत होता है (जैसे फाउलर ने नियमित कोड के लिए)
निकोले

26

मैं वास्तव में एक सरल समाधान के बारे में सोचना शुरू कर रहा हूँ, पता नहीं क्यों मैं इसके बारे में पहले नहीं सोचा था !!

  • डेटाबेस (स्कीमा और डेटा दोनों) को डुप्लिकेट करें।
  • नए-बड़े-परिवर्तनों के लिए शाखा में, नए डुप्लिकेट डेटाबेस का उपयोग करने के लिए केवल प्रोजेक्ट कॉन्फ़िगरेशन बदलें।

इस तरह मैं डेटाबेस स्कीमा परिवर्तन के बारे में चिंता किए बिना शाखाओं को स्विच कर सकता हूं।

संपादित करें:

डुप्लिकेट करके, मेरा मतलब है कि एक अलग नाम (जैसे my_db_2) के साथ एक और डेटाबेस बनाएं ; डंप या ऐसा कुछ भी नहीं कर रहा है।


3
यह सबसे सरल और सबसे कुशल समाधान की तरह लगता है, लेकिन यह अच्छा होगा यदि इसे स्वचालित करने का कोई तरीका था ... मुझे आश्चर्य है कि वहाँ अभी तक कुछ नहीं है ...
जस्टमैयर

git हुक शाखा के नाम के आधार पर टेम्पलेट से एक डेटाबेस बनाने के लिए,
dalore

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

बहुत सुंदर हर शाखा अपने स्वयं के DB, हुह है? I
olli

19

LiquiBase जैसी किसी चीज़ का उपयोग करें, इससे आप अपनी Liquibase फ़ाइलों का संशोधन नियंत्रण रख सकते हैं। आप केवल उत्पादन के लिए परिवर्तनों को टैग कर सकते हैं, और अपने DB को उत्पादन या विकास, या (जो भी योजना आप चाहते हैं) के लिए अद्यतित रख सकते हैं।


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

1
यदि आप अपनी आईडी = और लेखक = टैग के बारे में सावधान हैं, तो यह पूरी तरह से ठीक काम करेगा। सिद्धांत रूप में प्रत्येक उपयोगकर्ता की अपनी लेखक प्रविष्टि (GOOD) होगी और यदि आप id = के साथ कुछ उचित करते हैं, तो YYYYMMDD_REV कहते हैं, तो आप जाने के लिए बहुत अच्छे हैं। यहां तक ​​कि git के साथ, अधिकांश में किसी दिए गए प्रोजेक्ट के लिए एक 'सेंट्रल रेपो' होता है। 99% लोगों में कुछ 'केंद्रीय' नहीं है। फिर से, लिक्विबेस फाइलें केवल एक्सएमएल-इश फाइलों की योजना बना रही हैं, जिसमें दिए गए डीबी (या सेट) के खिलाफ निष्पादित करने के लिए कमांड का एक स्टैक होता है। संभावना यह है कि सभी परियोजनाओं के 99% में 0 मुद्दे होते हैं जो व्यवहार में आते हैं, यहां तक ​​कि डीवीसीएस के साथ भी।
ज़ी

इस जवाब के लिए +1। यह हम कई परियोजनाओं में उपयोग करते हैं। Ids को केवल एक xml फ़ाइल में अद्वितीय होना चाहिए। यदि आप उपयोग केस से आईडी का नाम लागू कर रहे हैं तो वे अद्वितीय हैं। आपको सावधान रहना होगा कि पहले से लागू परिवर्तनों को संशोधित न करें अन्यथा आपको चेकसम त्रुटियां मिलेंगी।
बर्नार्डन

7

इसी तरह की जरूरत का सामना किया और यहाँ डेटाबेस संस्करण नियंत्रण प्रणाली पर मेरा शोध है:

  1. स्किच - पर्ल आधारित खुला स्रोत; PostgreSQL https://github.com/sqitchers/sqitch सहित सभी प्रमुख डेटाबेस के लिए उपलब्ध है
  2. महावत - केवल पोस्टग्रेक्ज़ के लिए; खुला स्रोत डेटाबेस स्कीमा संस्करण नियंत्रण। https://github.com/cbbrowne/mahout
  3. लिक्विबेस - एक अन्य खुला स्रोत डीबी संस्करण नियंत्रण स्व। दातिक का मुफ्त संस्करण। http://www.liquibase.org/index.html
  4. लिटिकल का व्यावसायिक संस्करण - https://www.datical.com/
  5. BoxFuse द्वारा फ्लाईवे - वाणिज्यिक sw। https://flywaydb.org/
  6. एक अन्य ओपन सोर्स प्रोजेक्ट https://gitlab.com/depesz/Versioning लेखक यहां एक गाइड प्रदान करता है: https://www.depesz.com/2010/08/22/versioning/
  7. रेड गेट चेंज ऑटोमेशन - केवल SQL सर्वर के लिए। https://www.red-gate.com/products/sql-development/sql-change-automation/

अतीत में, वहाँ भी कुछ कहा गया है ChronicDB: ChronicDB provides dynamic database upgrades with zero database downtime and inconsistencies. crunchbase.com/organization/chronicdb#section-overview क्रिस्टिस माक्रिस नाम का एक लड़का संस्थापकों में से एक था, जो शायद SCMBug के लिए जाना जाता है: mkgnu.net -scmbug
Thorsten

6

डॉक्ट्रिन के तहत माइग्रेशन नामक एक महान परियोजना है जो सिर्फ इस उद्देश्य के लिए बनाई गई है।

यह अभी भी अल्फा राज्य में है और php के लिए बनाया गया है।

http://docs.doctrine-project.org/projects/doctrine-migrations/en/latest/index.html


ऑप्स! आपका लिंक टूट गया है ... शायद आपका यह मतलब है: github.com/doctrine/migrations
फ्रांसेस्को कसुला

यहाँ बंडल के लिए डॉक्स जो सिम्फनी 2
फ्रांसेस्को

1
टिप के लिए धन्यवाद, डॉक्ट्रिन लोगों में डॉक्स के स्थान को बदलने की प्रवृत्ति है, जिसके परिणामस्वरूप कई टूटे हुए लिंक हैं, दोनों यहां और Google पर। लिंक तय किया।
हकन डेरिल

4

मैं इस सवाल पर आया हूं, जैसा कि मुझे एक समान समस्या मिली है, जहां एक डीबी आधारित निर्देशिका संरचना का अनुमान लगाने वाला कुछ, 'फाइलें' संग्रहीत करता है, और मुझे इसे प्रबंधित करने के लिए गिट की आवश्यकता है। यह प्रतिकृति भरकर, क्लाउड पर वितरित किया जाता है, इसलिए यह एक्सेस प्वाइंट MySQL के माध्यम से होगा।

उपर्युक्त उत्तरों का सार, इसी तरह से पूछे गए समस्या के वैकल्पिक समाधान का सुझाव देता है, जो कि किसी डेटाबेस में कुछ को प्रबंधित करने के लिए Git का उपयोग करने की बात को याद करता है, इसलिए मैं उस प्रश्न का उत्तर देने का प्रयास करूंगा।

गिट एक प्रणाली है, जो संक्षेप में डेल्टास (अंतर) के एक डेटाबेस को संग्रहीत करता है, जिसे फिर से प्रस्तुत किया जा सकता है, क्रम में, एक संदर्भ को पुन: पेश करने के लिए। Git का सामान्य उपयोग मानता है कि संदर्भ एक फाइलसिस्टम है, और वे डेल्टा भिन्न हैं जो उस फाइल सिस्टम में हैं, लेकिन वास्तव में सभी git हैं, डेल्टास (पदानुक्रमित) का एक श्रेणीबद्ध डेटाबेस है, क्योंकि ज्यादातर मामलों में यह डेल्टा कम से कम 1 के साथ एक प्रतिबद्ध है। माता-पिता, एक पेड़ में व्यवस्थित)।

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

यदि आप किसी डेटाबेस में परिवर्तन का प्रबंधन करना चाहते हैं, तो आपके पास 2 असतत समस्याएं हैं, और मैं उन्हें अलग से संबोधित करूंगा (यदि मैं आप थे)। पहला स्कीमा है, दूसरा डेटा है (हालांकि आपके प्रश्न में, आप स्टेट डेटा कुछ ऐसा नहीं है जिसके बारे में आप चिंतित हैं)। एक समस्या जो मुझे पहले से थी, वह एक देव और प्रोडक्ट डेटाबेस थी, जहाँ देव स्कीमा में वृद्धिशील परिवर्तन ले सकते थे, और उन परिवर्तनों को सीवीएस में प्रलेखित किया जाना था, और जीने के लिए प्रचार किया गया था, साथ ही कई 'स्थिर' में परिवर्धन भी किया था। टेबल। हमने क्रूज़ नामक 3 डी डेटाबेस के साथ ऐसा किया, जिसमें केवल स्थैतिक डेटा था। किसी भी समय देव और क्रूज से स्कीमा की तुलना की जा सकती है, और हमारे पास उन 2 फाइलों के अंतर को लेने के लिए एक स्क्रिप्ट थी और इसे लागू करने के लिए ALTER स्टेटमेंट युक्त SQL फाइल का उत्पादन किया। इसी तरह कोई भी नया डेटा, INSERT कमांड वाले SQL फ़ाइल में डिस्टिल्ड किया जा सकता है। जब तक खेतों और तालिकाओं को केवल जोड़ा जाता है, और कभी भी हटाया नहीं जाता है, प्रक्रिया डेल्टा को लागू करने के लिए SQL बयानों को स्वचालित कर सकती है।

वह तंत्र जिसके द्वारा गिट उत्पन्न होता है डेल्टास है diffऔर वह तंत्र जिसके द्वारा यह एक फ़ाइल के साथ 1 या अधिक डेल्टास को जोड़ता है, कहलाता है merge। यदि आप एक अलग संदर्भ से अलग और विलय के लिए एक विधि के साथ आ सकते हैं, तो गिट काम करना चाहिए, लेकिन जैसा कि चर्चा की गई है आप एक उपकरण को पसंद कर सकते हैं जो आपके लिए ऐसा करता है। इसे हल करने की दिशा में मेरा पहला विचार यह है कि यह https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration#External-Merge-and-Diff-Tools है जिसमें विवरण है कि git के आंतरिक अंतर को कैसे बदलें और मर्ज उपकरण। मैं इस उत्तर को अपडेट करूंगा, जैसा कि मैं समस्या के बेहतर समाधान के साथ आता हूं, लेकिन मेरे मामले में मुझे केवल डेटा परिवर्तनों का प्रबंधन करने की उम्मीद है, इसलिए, अब तक के रूप में एक डीबी आधारित फ़ाइलस्टोर बदल सकता है, इसलिए मेरा समाधान हो सकता है कि वास्तव में आप क्या जरूरत नहीं है।


3

RedGate SQL Source Control पर एक नज़र डालें।

http://www.red-gate.com/products/sql-development/sql-source-control/

यह उपकरण एक SQL सर्वर प्रबंधन स्टूडियो स्नैप-इन है, जिसमें आप अपने डेटाबेस को Git के साथ सोर्स कंट्रोल में रख सकते हैं।

यह प्रति उपयोगकर्ता $ 495 पर थोड़ा महंगा है, लेकिन 28 दिन का निःशुल्क परीक्षण उपलब्ध है।

ध्यान दें मैं किसी भी तरह से RedGate से संबद्ध नहीं हूं।


3

मैं कुछ ऐसा ही बनाना चाहता हूं, अपने संस्करण नियंत्रण प्रणाली में मेरा डेटाबेस परिवर्तन जोड़ें।

मैं इस पोस्ट में व्लादिमीर खोरीकोव "डेटाबेस वर्जनिंग बेस्ट प्रैक्टिस" से विचारों का पालन करने जा रहा हूं । संक्षेप में मैं करूँगा

  • एक स्रोत नियंत्रण प्रणाली में अपने स्कीमा और संदर्भ डेटा दोनों को संग्रहीत करें।
  • हर संशोधन के लिए हम परिवर्तनों के साथ एक अलग SQL स्क्रिप्ट बनाएंगे

मामले में यह मदद करता है!


3
  • Irmin
  • Flur.ee
  • क्रूज़ डी.बी.

मैं थोड़ी देर के लिए पोस्टग्रेज (या सामान्य रूप से SQL डेटाबेस) के लिए एक ही सुविधा की तलाश में था, लेकिन मुझे उपयुक्त (सरल और सहज) होने के लिए कोई उपकरण नहीं मिला। यह संभवतः बाइनरी प्रकृति के कारण है कि डेटा कैसे संग्रहीत किया जाता है। क्लोनियो आदर्श लगता है लेकिन मृत दिखता है। नोम्स डीबी दिलचस्प ( और जीवित ) दिखता है । इरमिन पर भी एक नजर (Git-properties के साथ आधारित) ।

यद्यपि यह इस प्रश्न का उत्तर नहीं देता है कि यह पोस्टग्रैस के साथ काम करेगा, Flur.ee देखें डेटाबेस देखें। इसमें एक "समय-यात्रा" सुविधा है जो आपको समय में डेटा को मनमाने ढंग से क्वेरी करने की अनुमति देती है। मैं अनुमान लगा रहा हूं कि इसे "ब्रांचिंग" मॉडल के साथ काम करने में सक्षम होना चाहिए।

यह डेटाबेस हाल ही में ब्लॉकचेन-उद्देश्यों के लिए विकसित किया गया था। ब्लॉकचेन की प्रकृति के कारण, डेटा को वेतन वृद्धि में दर्ज करने की आवश्यकता होती है, जो वास्तव में कैसे काम करता है। वे Q2 2019 में एक ओपन-सोर्स रिलीज़ को लक्षित कर रहे हैं ।

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

अपडेट : क्रूक्स डेटाबेस को भी देखें, जो आवेषण के समय आयाम में क्वेरी कर सकता है, जिसे आप 'संस्करण' के रूप में देख सकते हैं। क्रूज़ अत्यधिक मूल्यांकन किए गए डेटामिक का एक ओपन-सोर्स कार्यान्वयन प्रतीत होता है।

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


2

आप इसे परमाणु के बिना नहीं कर सकते हैं, और आप pg_dump या स्नैपशॉट फ़ाइल सिस्टम का उपयोग किए बिना परमाणु नहीं प्राप्त कर सकते हैं।

मेरे पोस्टग्रेज का उदाहरण zfs पर है, जिसे मैं कभी-कभी स्नैपशॉट देता हूं। यह लगभग तुरंत और सुसंगत है।


2

आप जो चाहते हैं, आत्मा में, शायद पोस्ट फैक्टो की तरह कुछ है , जो एक डेटाबेस में एक डेटाबेस के संस्करणों को संग्रहीत करता है। इस प्रस्तुति की जाँच करें ।

जाहिरा तौर पर परियोजना वास्तव में कभी भी कहीं भी नहीं गई थी, इसलिए शायद यह आपको तुरंत मदद नहीं करेगा, लेकिन यह एक दिलचस्प अवधारणा है। मुझे डर है कि इसे ठीक से करना बहुत मुश्किल होगा, क्योंकि लोगों को अपने काम पर भरोसा करने के लिए भी संस्करण 1 को सभी विवरण सही प्राप्त करने होंगे।


2

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

Postgres और mysql पेचीदा होते हैं, क्योंकि बाइनरी डेटा को कई फ़ाइलों में रखा जाता है और यदि आप इसे स्नैपशॉट करने में सक्षम थे तो यह मान्य भी नहीं हो सकता है।

https://github.com/cannadayr/git-sqlite


लगता है जैसे आप बाइनरी डेटा को git स्टोर करते हैं, जैसा है। इसके बजाय, कोई डिप्स को स्टोर करने के लिए स्वच्छ / स्मूद फिल्टर का उपयोग कर सकता है। हैं कुछ स्क्रिप्ट जो करते हैं।
11:

1
जब आप दो डेटाबेस स्टेट्स को छोड़कर डिसेंट अप्रोच करते हैं, तो आप डंप का टेक्स्टुअल डिफरेंस करते हैं। एक कस्टम डिफ ड्राइवर के रूप में sqldiff का उपयोग करके आप अपने डेटाबेस को अगले राज्य में म्यूट करने के लिए वास्तविक कमांड प्राप्त करते हैं।
cannadayr

1

मुझे लगता है कि X-Istence सही रास्ते पर है, लेकिन इस रणनीति में कुछ और सुधार किए जा सकते हैं। पहला उपयोग:

$pg_dump --schema ... 

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

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

$pg_dump --table=.. <or> --exclude-table=..

यह एक अच्छा विचार है क्योंकि जब आपका डेटाबेस 100Mb + पूर्ण डेटा डंप कर रहा होता है तो रेपो वास्तव में स्पष्ट हो सकता है। एक बेहतर विचार यह है कि आप अपने ऐप का परीक्षण करने के लिए आवश्यक डेटा के अधिक न्यूनतम सेट का बैकअप लें। यदि आपका डिफ़ॉल्ट डेटा हालांकि बहुत बड़ा है, फिर भी इससे समस्याएँ हो सकती हैं।

यदि आपको रेपो में पूर्ण बैकअप रखने की आवश्यकता है, तो इसे अपने स्रोत ट्री के बाहर एक शाखा में करने पर विचार करें। मिलान svn रेव के कुछ संदर्भ के साथ एक बाहरी बैकअप प्रणाली, हालांकि इसके लिए सबसे अच्छा है।

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

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


डंप सिर्फ एक बैकअप नहीं है?
hasen

हां, लेकिन आप इसे वैकल्पिक डेटाबेस में पुनर्स्थापित कर सकते हैं और वहां अपने संशोधन कर सकते हैं।
द सना

1

इस सवाल का बहुत अधिक जवाब दिया गया है, लेकिन मैं एक छोटे से सुझाव के साथ X-Istence's और Dana the Sane के उत्तर को पूरक करना चाहूंगा।

यदि आपको कुछ हद तक ग्रैन्युलैरिटी के साथ रिविजन कंट्रोल की आवश्यकता है, तो रोजाना कहें, आप टेबल्स और स्कीमा दोनों के टेक्स्ट डंप को rdiff- बैकअप जैसे टूल से जोड़ सकते हैं जो वृद्धिशील बैकअप करता है। लाभ यह है कि दैनिक बैकअप के स्नैपशॉट संग्रहीत करने के बजाय, आप पिछले दिन के अंतर को संग्रहीत करते हैं।

इसके साथ आपके पास संशोधन नियंत्रण का लाभ है और आप बहुत अधिक स्थान बर्बाद नहीं करते हैं।

किसी भी मामले में, बड़ी सपाट फ़ाइलों पर सीधे गिट का उपयोग करना जो बहुत बार बदलते हैं, एक अच्छा समाधान नहीं है। यदि आपका डेटाबेस बहुत बड़ा हो जाता है, तो git को फ़ाइलों को प्रबंधित करने में कुछ समस्याएं होने लगेंगी।


1

यहाँ मैं अपनी परियोजनाओं में क्या करने की कोशिश कर रहा हूँ:

  • अलग डेटा और स्कीमा और डिफ़ॉल्ट डेटा।

डेटाबेस कॉन्फ़िगरेशन कॉन्फ़िगरेशन फ़ाइल में संग्रहीत किया जाता है जो संस्करण नियंत्रण (.gitignore) के अंतर्गत नहीं है

डेटाबेस डिफॉल्ट (नई परियोजनाएं स्थापित करने के लिए) संस्करण नियंत्रण के तहत एक सरल SQL फ़ाइल है।

डेटाबेस स्कीमा के लिए संस्करण नियंत्रण के तहत एक डेटाबेस स्कीमा डंप बनाएं।

सबसे सामान्य तरीका अद्यतन स्क्रिप्ट है जिसमें SQL कथन, (तालिका तालिका .. या अद्यतन) है। आपको अपने डेटाबेस में एक स्थान होना चाहिए जहाँ आप स्कीमा के वर्तमान संस्करण को बचाते हैं)

अन्य बड़े ओपन सोर्स डेटाबेस प्रोजेक्ट्स (pivik, या आपके पसंदीदा cms सिस्टम) पर एक नज़र डालें, वे सभी अपडेट (1.sql, 2.sql, 3.sh, 4.php.5.sql) का उपयोग करते हैं

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

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

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


1

मैं डेटाबेस को नियंत्रित करने वाले संस्करण के लिए neXtep की सिफारिश करूंगा , इसे प्रलेखन और मंचों का एक अच्छा सेट मिला है, जो बताता है कि कैसे स्थापित करें और त्रुटियों का सामना करना पड़ा। मैंने इसे postgreSQL 9.1 और 9.3 के लिए परीक्षण किया है, मैं इसे 9.1 के लिए काम करने में सक्षम था, लेकिन 9.3 के लिए यह काम नहीं करता है।


@ निकोलय हाँ यह बंद हो गया है लगता है। एक वैकल्पिक के रूप में आप स्काईच की
जेरी एम सनी

धन्यवाद, इसकी जाँच करेंगे!
निकोले

1

मैं अपनी व्यक्तिगत परियोजनाओं में क्या करता हूं, मैं अपने पूरे डेटाबेस को ड्रॉपबॉक्स पर संग्रहीत करता हूं और फिर MAMP, WAMP वर्कफ़्लो को वहां से सही उपयोग करने के लिए इंगित करता हूं .. इस तरह डेटाबेस हमेशा अप-टू-डेट रहता है, जहां कभी मुझे कुछ विकासशील करने की आवश्यकता होती है। लेकिन यह सिर्फ देव के लिए है! लाइव साइट्स उस ऑफ कोर्स के लिए खुद के सर्वर का उपयोग कर रही हैं! :)


1

गिट वर्जनिंग नियंत्रण के तहत डेटाबेस के प्रत्येक स्तर को संग्रहीत करना आपके संपूर्ण डेटाबेस को प्रत्येक कमिट और पुनर्स्थापित करने के साथ धक्का देने जैसा है प्रत्येक पुल के साथ अपने पूरे डेटाबेस। यदि आपका डेटाबेस महत्वपूर्ण परिवर्तनों से ग्रस्त है और आप उन्हें ढीला करने का जोखिम नहीं उठा सकते हैं, तो आप बस अपने pre_commit और post_merge हुक को अपडेट कर सकते हैं। मैंने अपनी परियोजनाओं में से एक के साथ ऐसा ही किया और आप यहां निर्देश पा सकते हैं ।


1

मैं इसे कैसे करता हूं:

चूँकि आपके पास डीबी के बारे में फ्री चॉइस है जैसे फ़ाइलबेड डीबी का उपयोग करें जैसे कि फायरबर्ड।

एक टेम्पलेट DB बनाएं जिसमें स्कीमा हो जो आपकी वास्तविक शाखा को फिट करता है और इसे आपके भंडार में संग्रहीत करता है।

अपने एप्लिकेशन को प्रोग्राम करते समय अपने टेम्पलेट DB की कॉपी बनाएं, इसे कहीं और स्टोर करें और बस उस कॉपी के साथ काम करें।

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


1

हम एक मानक LAMP कॉन्फ़िगरेशन पर, एक सामाजिक वेबसाइट चलाते थे। हमारे पास एक लाइव सर्वर, टेस्ट सर्वर और विकास सर्वर, साथ ही साथ स्थानीय डेवलपर्स मशीनें थीं। सभी को जीआईटी का उपयोग करके प्रबंधित किया गया।

प्रत्येक मशीन पर, हमारे पास PHP फाइलें थीं, लेकिन MySQL सेवा भी थी, और एक फ़ोल्डर जिसमें उपयोगकर्ता अपलोड करेंगे। लाइव सर्वर कुछ 100K (!) आवर्तक उपयोगकर्ताओं के लिए बढ़ गया, डंप लगभग 2GB (!) था, छवि फ़ोल्डर कुछ 50GB (!) था। जब तक मैंने छोड़ा, तब तक हमारा सर्वर अपने सीपीयू, राम की सीमा तक पहुंच रहा था, और सबसे बढ़कर, समवर्ती नेट कनेक्शन सीमाएं (हमने सर्वर कार्ड ड्राइवर के अपने संस्करण का संकलन किया था ताकि सर्वर 'लोल' को अधिकतम किया जा सके)। हम जीआईटी में 2GB डेटा और 50GB इमेज नहीं डाल सकते ( न ही आपको अपनी वेबसाइट के साथ मान लेना चाहिए )।

GIT के तहत यह सब आसानी से प्रबंधित करने के लिए, हम इन फ़ोल्डर रास्तों को .gitignore में डालकर बाइनरी फ़ोल्डर्स (चित्र युक्त फ़ोल्डर) को अनदेखा करेंगे। हमारे पास Apache documentroot पथ के बाहर SQL नामक एक फ़ोल्डर भी था। उस एसक्यूएल फ़ोल्डर में, हम अपनी एसक्यूएल फाइलों को डेवलपर्स से वृद्धिशील संख्याओं (001.florianm.sql, 001.johns.sql, 002.florianm.sql, आदि) में डालेंगे। इन SQL फ़ाइलों को GIT द्वारा प्रबंधित किया गया था। पहली sql फ़ाइल में वास्तव में DB स्कीमा का एक बड़ा सेट होगा। हम GIT में उपयोगकर्ता-डेटा नहीं जोड़ते हैं (उदाहरण के लिए उपयोगकर्ता तालिका, या टिप्पणियाँ तालिका के रिकॉर्ड), लेकिन कॉन्फ़िगर या टोपोलॉजी या अन्य साइट विशिष्ट डेटा जैसे डेटा, sql फ़ाइलों (और इसलिए GIT) में बनाए रखा गया था। ज्यादातर इसके डेवलपर्स (जो कोड को सबसे अच्छा जानते हैं) जो यह निर्धारित करते हैं कि SQL स्कीमा और डेटा के संबंध में GIT द्वारा क्या और क्या बनाए रखा गया है।

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

यदि परीक्षण सर्वर पर समस्याएं थीं, उदाहरण के लिए। मर्ज में बहुत अधिक संघर्ष थे, फिर कोड को वापस कर दिया गया था (कार्य शाखा को 'लाइव' की ओर इशारा करते हुए) और sql फ़ाइलों को कभी भी निष्पादित नहीं किया गया था। जिस क्षण SQL फ़ाइलों को निष्पादित किया गया था, उस समय यह एक गैर-प्रतिवर्ती कार्रवाई के रूप में माना जाता था। यदि SQL फाइलें ठीक से काम नहीं कर रही थीं, तो DB को डंप का उपयोग करके बहाल किया गया था (और डेवलपर्स ने बताया कि, गैर-परीक्षण SQL फ़ाइलों को प्रदान करने के लिए)।

आज, हम समान फ़ाइल नाम के साथ, एक sql-up और sql-down फ़ोल्डर दोनों को बनाए रखते हैं, जहाँ डेवलपर्स को यह परीक्षण करना होता है कि दोनों उन्नयन sql फाइलें समान रूप से डाउनग्रेड की जा सकती हैं। यह अंततः बैश स्क्रिप्ट के साथ निष्पादित किया जा सकता है, लेकिन इसका एक अच्छा विचार है अगर मानव आंखें अपग्रेड प्रक्रिया की निगरानी करती रहीं।

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


0

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

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


0

मैं संपूर्ण डेटाबेस को संस्करण नियंत्रण में रखना चाहूंगा, मैं किस डेटाबेस इंजन का उपयोग कर सकता हूं ताकि मैं वास्तविक डेटाबेस को इसके डंप के बजाय संस्करण नियंत्रण में रख सकूं?

यह डेटाबेस इंजन पर निर्भर नहीं है। Microsoft SQL सर्वर द्वारा प्रोग्राम को नियंत्रित करने वाले बहुत सारे संस्करण हैं। मुझे नहीं लगता कि समस्या को हल किया जा सकता है, आपको एक pgsql विशिष्ट स्कीमा संस्करण नियंत्रण प्रणाली का उपयोग करना होगा। मुझे नहीं पता कि ऐसी कोई चीज मौजूद है या नहीं ...


2
आपको वास्तव में klonio पर एक नज़र डालनी चाहिए जो कि संस्करण डेटाबेस के लिए दर्जी है (वर्तमान में Mongo और MySQL का समर्थन करता है)। अभी भी बीटा में है, लेकिन काफी आशाजनक लगता है।
farthVader

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