2010-11-23 12 views
22

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

हालांकि, मुझे पता है कि चालाक समाधानों में कभी-कभी मौलिक त्रुटियां होती हैं। गिट में mysqldump diffs को संग्रहीत करने के लिए मैं किस तरह के मुद्दों को मार सकता हूं? यह इसके लायक है? सर्वर पर एकाधिक डेटाबेस बैकअप रखने के लिए अधिकांश लोग क्या करते हैं और अनावश्यक प्रतियां कहीं और रखते हैं?

+0

मूल रूप से सीवीएस के साथ मेरी आखिरी दुकान क्या है। –

+0

आप अमेज़ॅन के आरडीएस (http://aws.amazon.com/rds/) को देखना चाहते हैं, इसमें एक वृद्धिशील स्नैपशॉट टूल है जो बैकअप के लिए आसान है (S3 कम नहीं)। –

उत्तर

6

यह दृष्टिकोण मेरे लिए ठीक लगता है। मैं अपने स्वयं के महत्वपूर्ण डेटा का बैक अप लेने के लिए गिट का उपयोग करता हूं।

ध्यान दें कि आप diffs संग्रहित नहीं कर रहे हैं - गिट प्रभावी ढंग से प्रत्येक प्रतिबद्धता के साथ निर्देशिका स्थिति के स्नैपशॉट स्टोर करता है। आप दो प्रतिबद्धताओं का अंतर उत्पन्न कर सकते हैं, लेकिन वास्तविक भंडारण तंत्र के पास भिन्नता से कोई लेना देना नहीं है।

+0

असल में, गिट पैक ऑब्जेक्ट्स, या डेल्टा, जैसे आप पसंद करते हैं, एक बहुत ही कुशल तरीके से पैक करते हैं :) – user1338062

+0

@ user1338062 यह आमतौर पर स्वचालित रूप से नहीं होगा, जब तक कि भंडार पर्याप्त रूप से पर्याप्त न हो जाए। – cdhowie

12

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

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

+1

यह एक अच्छा मुद्दा है। यदि आप अपना डेटाबेस इतिहास * हमेशा के लिए रखना चाहते हैं *, गिट बस यही करेगा। उदाहरण के लिए, हमारी दुकान दैनिक डंप करती है लेकिन साप्ताहिक डंप को हमेशा के लिए रखते हुए केवल पिछले 7 दिनों तक रखती है। – erjiang

+0

मुझे वर्कफ़्लो में महत्वपूर्ण बिंदुओं पर एक MySQL स्नैपशॉट संग्रहीत करने में रुचि होगी। उदाहरण के लिए, जब मेरे स्थानीय विकास बॉक्स पर विकास होता है, तो जब मैं केंद्रीय रिपो को कोड दबाता हूं (जो निर्माण द्वारा, कोड के अनुरूप हो) तो एक MySQL स्नैपशॉट लेने का अर्थ हो सकता है। उस पर कोई विचार? –

+0

@ क्रिस्टियननैली: दस्तावेज़ीकरण के साधन के रूप में कॉन्फ़िगर किए गए लेकिन खाली डेटाबेस के स्नैपशॉट या डेवलपर्स के लिए शॉर्टकट सही मायने रखता है। मुझे लगता है कि मूल प्रश्न * पूर्ण * डेटाबेस का बैक अप लेने के बारे में था। –

3

सिद्धांत में यह काम करेगा, लेकिन डेटाबेस डंप बड़े होने पर आपको समस्याएं शुरू हो जाएंगी।

गिट में कोई हार्ड फ़ाइल आकार सीमा नहीं है, लेकिन यह आपके नवीनतम डंप की सामग्री को पहले से भंडार में संग्रहीत किया जाएगा, जिसके लिए उन दोनों फ़ाइलों के आकार के रूप में कम से कम स्मृति की आवश्यकता होगी एक साथ जोड़ा गया - तो मुझे लगता है कि यह 100 एमबी (या यहां तक ​​कि 10 एमबी) से अधिक फ़ाइलों के साथ बहुत धीमी गति से शुरू हो जाएगा।

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

+0

-1 गिट अलग-अलग के रूप में काम नहीं करता है। चूंकि आपका तर्क इस आधार पर निर्भर करता है, यह अमान्य है। – cdhowie

+3

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

+0

पाठ * "यह आपके नवीनतम डंप की सामग्री को पहले से भंडार में संग्रहीत किया जाएगा" * स्पष्ट रूप से इंगित करता है कि उसका मतलब भंडारण है, हस्तांतरण नहीं - क्योंकि अन्यथा वह उल्लेख करता था कि कई प्रतिबद्धताओं को धक्का देने से अधिक कुशल होगा एक बार में एक। मैं समझता हूं कि वह क्या कहने की कोशिश कर रहा है, लेकिन डेल्टा संपीड़न के कारण, यह वास्तव में बहुत सटीक नहीं है। मेरे यहां डेटा के डंप हैं जहां प्रत्येक प्रतिबद्धता 1.2-1.7 एमबी डेटा का प्रतिनिधित्व करती है, 123 काम करता है, और रेपो 532 केबी है। याद रखें कि प्रतिबद्धता भी खुद के खिलाफ डेल्टा-संपीड़ित होती है, न केवल पूर्व कार्य करता है। – cdhowie

1

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

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

ईमानदारी से, मुझे लगता है कि केवल MySQL के मूल उपकरण का उपयोग करना बेहतर समाधान होगा, लेकिन जो मैंने यहां बताया है, वह आपको अपने MySQL डेटा को संस्करणित कर देता है जो मुझे लगता है कि आप पहले स्थान पर थे।

संबंधित मुद्दे