क्या PostgreSQL के साथ डेटाबेस स्नैपशॉट को जल्दी से बनाना / पुनर्स्थापित करना संभव है?


52

सबसे पहले, मैं एक डेवलपर हूं, डीबीए या सिसाडमिन नहीं; कृपया सभ्य रहिये :)

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

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

मुझे सिस्टम पर एकमात्र उपयोगकर्ता होने की गारंटी है, और मेरे पास रूट एक्सेस है। डेटाबेस डंप ~ 100MB है जब tar'ed और gzip'ed। PostgreSQL संस्करण 8.3 है।

किसी भी उपयोगी विचारों के लिए अग्रिम धन्यवाद।


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

1
क्या आप केवल उन तालिकाओं को बहाल कर रहे हैं जो बदल गए हैं?
जैक डगलस

1
@ जैक डगलस: मैं डब से पूरा डीबी बहाल कर रहा हूं। प्रश्न तालिका में डेटा के लगभग 2/3 भाग हैं, और मुझे अभी भी सही बहाली आदेश और विदेशी कुंजी प्रतिबंधों के बारे में चिंता करनी होगी।
ज़िल्क

1
@DrColossus: हां, पिछले राज्य को पुनर्स्थापित करने के लिए डंप पर्याप्त हैं, लेकिन उन्हें बनाना और लगाना बहुत धीमा है।
Zilk

जवाबों:


35

आप फ़ाइल-सिस्टम स्तर स्नैपशॉट का उपयोग कर सकते हैं, लेकिन यह अक्सर बहुत बोझिल होता है, विशेष फ़ाइल सिस्टम की आवश्यकता होती है, और हमेशा उपलब्ध नहीं होती है, विशेष रूप से उम्र बढ़ने वाले लैपटॉप पर। ;-)

कैसे आप डेटाबेस के रूप में अपना आधार राज्य बनाते हैं, और फिर CREATE DATABASE ... TEMPLATEकार्यक्षमता का उपयोग करते हुए, अपने टेस्ट रन के लिए इससे एक नया डेटाबेस बनाते हैं । परीक्षण के बाद, आप उस डेटाबेस को फेंक देते हैं। तब आपका गति अवरोध अनिवार्य रूप से केवल cp -Rडेटाबेस निर्देशिका के लिए समय होता है। आप फ़ाइल सिस्टम स्नैपशॉट जादू के बिना प्राप्त करने के लिए के रूप में उपवास के बारे में है।


यह एक बहुत अच्छा विचार है। मैंने डेटाबेस टेम्प्लेट के बारे में बिल्कुल नहीं सोचा था। धन्यवाद!
Zilk

1
यह एक महान समाधान है, ड्रॉप-रिस्टोर की तुलना में 5 गुना तेज है, लेकिन एक नकारात्मक पहलू है: आपको ऐसा करने से पहले वर्तमान कनेक्शन को छोड़ने की आवश्यकता है अन्यथा यह चलाने में विफल हो जाएगा।
सोरिन

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

11

Stellar का उपयोग करें , यह डेटाबेस के लिए git जैसा है :

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



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

तारकीय एक महान विचार की तरह लगता है, लेकिन मेरे लिए काम नहीं कर रहा है
ऑरलैंडो

5

यदि आपका डेटाबेस वर्चुअलबॉक्स में चलता है , तो आप आसानी से स्नैपशॉट को बचा सकते हैं और डेटाबेस स्टेट और OS दोनों के स्नैपशॉट को कुछ ही सेकंड में (या 1-2 मिनट में पुनर्स्थापित कर सकते हैं) यदि आपके पास वास्तव में डेटाबेस या ओएस में बहुत अधिक डेटा है या बहुत आभासी मशीन को थोड़ी मेमोरी आवंटित) मुफ्त में।

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


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


आह कुछ नहीं, मैंने आपकी टिप्पणी नहीं देखी जिसमें उल्लेख है कि आप पहले से ही virtualbox के बारे में जानते हैं।
Wildpeaks

3

संभवत: वह उत्तर नहीं जिसकी आप उम्मीद कर रहे हैं, लेकिन क्या आपने स्नैपशॉट के कुछ निचले स्तर पर विचार किया है - उदाहरण के लिए LVM?


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

2

जब यह करने की कोशिश की जा रही है तो यह प्रश्न मिला और पोस्टग्रेसल डेटा निर्देशिका पर गिट का उपयोग करके समाप्त हो गया। परिवर्तनों को छोड़ना उतना ही आसान है:

git reset --hard

6
बड़े डेटाबेस के लिए इसका कोई फायदा नहीं है। इसके अलावा, अत्याचार अलग आकार की द्विआधारी फ़ाइलों के साथ क्यों अत्याचार करते हैं?
रोलैंडमाइसीडीडीबीए

0

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


0

हालांकि मुझे कहना है Stellarऔर git reset --hardएक दिलचस्प समाधान है, मेरे पास बड़े डेटाबेस और परीक्षणों के साथ एक मुद्दा होगा, और मैं Virtualboxआदि समाधानों का उपयोग करता हूं , कभी-कभी बड़े परीक्षणों में, ये थोड़ा और अधिक "समस्याग्रस्त" हो जाते हैं जब आप नंगे धातु आदि समाधानों का उपयोग कर रहे हैं।

इस प्रकार, मुझे ZFSभविष्य में इन कारणों पर विचार करने के लिए एक फाइल सिस्टम के रूप में उल्लेख करना होगा, जो @Peter Eisentraut भी हैं:

  1. स्नैपशॉट - विशेष रूप से जब आप प्रोडक्ट से क्यूए / डीआर के लिए प्रतिकृति करते हैं, तो आप परीक्षणों के लिए उसी "फाइलसिस्टम" का उपयोग कर सकते हैं:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. परीक्षण करने के लिए, परीक्षण से ठीक पहले ऊपर के रूप में एक पोस्टग्रेजल स्टॉप करें, zfs snapshot $SNAPSHOTपोस्टग्रैस्कल शुरू करें, फिर रोलबैक करें, पोस्टग्रैसक्ल को रोकें, और बसzfs rollback $SNAPSHOT

  2. संपीड़न - Postgresql को मेरे डेटाबेस में एक विशिष्ट 3: 1 संपीड़न मिलता है, इसलिए आप बहुत अधिक परीक्षण कर सकते हैं;)

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