एक देव स्नैपशॉट के लिए तालिकाओं के केवल हिस्सों के डंप को पोस्ट करता है


95

उत्पादन पर हमारा डेटाबेस आकार में कुछ सौ गीगाबाइट है। विकास और परीक्षण के लिए, हमें इस डेटाबेस के स्नैपशॉट बनाने की आवश्यकता है जो कार्यात्मक रूप से समतुल्य हैं, लेकिन जो आकार में केवल 10 या 20 गिग्स हैं।

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

उदाहरण के लिए, मान लें कि हमारे पास ऐसी संस्थाएँ हैं जिनके कई-कई रिश्ते हैं:

  • कंपनी के पास एन डिवीजन हैं
  • डिवीजन में एन कर्मचारी हैं
  • कर्मचारी के पास एन अटेंडेंस रिकॉर्ड है

वहाँ शायद 1000 कंपनियों, 2500 डिवीजनों, 175000 कर्मचारियों, और लाखों की उपस्थिति रिकॉर्ड है। हम कहते हैं, पहले 100 कंपनियों और उसके सभी घटक डिवीजनों, कर्मचारियों और उपस्थिति रिकॉर्ड को खींचने के लिए एक प्रतिकृति तरीका है ।

हम वर्तमान में स्कीमा के लिए pg_dump का उपयोग करते हैं, और फिर pg_dump को --disable-triggers और --data के साथ चलाते हैं ताकि सभी डेटा को छोटी तालिकाओं से बाहर निकाला जा सके। हम डेटा के हिस्से को बाहर निकालने के लिए कस्टम स्क्रिप्ट लिखना नहीं चाहते हैं क्योंकि हमारे पास तेजी से विकास चक्र है और चिंतित हैं कि कस्टम स्क्रिप्ट नाजुक और तारीख से बाहर होने की संभावना है।

हम ऐसा कैसे कर सकते हैं? क्या तृतीय-पक्ष उपकरण हैं जो डेटाबेस से तार्किक विभाजन को बाहर निकालने में मदद कर सकते हैं? इन उपकरणों को क्या कहा जाता है?

किसी भी सामान्य सलाह की भी सराहना की!

जवाबों:


108

अपने बड़े तालिकाओं पर आप सबसेट को बाहर निकालने के लिए COPY कमांड का उपयोग कर सकते हैं ...

COPY (SELECT * FROM mytable WHERE ...) TO '/tmp/myfile.tsv'

COPY mytable FROM 'myfile.tsv'

https://www.postgresql.org/docs/current/static/sql-copy.html

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


1
मैंने ओपी के समान काम करने के लिए इस तकनीक का उपयोग बड़ी सफलता के लिए किया। टेस्ट रन के लिए मैंने COPY (SELECT ..) TO .. ​​को "टेम्पलेट" डेटाबेस में डेटा की कमी के लिए लोड किया और क्रिएट डेटा टेस्ट_रुन_एक्सएक्स प्रोडक्ट_एसएनएपशॉट_एक्सएक्स का उपयोग किया। मैं निश्चित रूप से डेटा को नंगे न्यूनतम तक कम कर देता हूं ताकि उत्पाद स्नैपशॉट लोड हो जाए और परीक्षण डीबी निर्माण संचालन तेजी से एक टीम बाधा न बने।
ट्रे

5
क्या इस काम को करने का कोई तरीका है यदि आपके पास कई ज्वाइन टेबल हैं जिन्हें आप स्नैपशॉट चाहते हैं? कई तालिकाओं के आयात का समर्थन नहीं करता है।
मिलीलीटर

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

5
ध्यान दें कि यह विधि कॉपी किए गए तालिकाओं पर अनुक्रमों को अपडेट नहीं करती है इसलिए आगे आवेषण प्राथमिक कुंजी बाधाओं का उल्लंघन कर सकते हैं।
user2859458 22

1
मुझे \copyइसके बजाय उपयोग करना था COPY, क्योंकि उत्तरार्द्ध केवल सुपरयुजर था। सौभाग्य से बाकी सब 9.1 में कोई अन्य परिवर्तन के साथ पूरी तरह से काम किया।
PJSCopeland

8

मैं किसी भी सॉफ्टवेयर के बारे में नहीं जानता जो पहले से ही ऐसा करता है, लेकिन मैं 3 वैकल्पिक समाधानों के बारे में सोच सकता हूं। दुर्भाग्य से, उन सभी को कुछ कस्टम कोडिंग की आवश्यकता होती है।

  1. एक अलग स्कीमा में सभी तालिकाओं को फिर से बनाएं, फिर उन तालिकाओं में कॉपी करें, केवल उस डेटा का सबसेट जिसे आप डंप करना चाहते हैं, का उपयोग करते हुए INSERT INTO copy.tablename SELECT * FROM tablename WHERE ...और डंप करें।

  2. SQL स्टेटमेंट के रूप में डेटा डंप करने के लिए अपनी स्क्रिप्ट लिखें। मैंने अतीत में इस दृष्टिकोण का उपयोग किया है और इसने केवल PHP की 20-30 लाइनों की तरह कुछ लिया है।

  3. Pg_dump को संशोधित करें ताकि यह एकल तालिका को डंप करते समय -t स्विच के साथ एक शर्त स्वीकार करे।


6

http://jailer.sourceforge.net/ ऐसा करता है।


12
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक हिस्सों को यहां शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
तावीज़

3
यह वास्तव में यहाँ मतलब नहीं है। ओपी ने विशेष रूप से थर्ड पार्टी टूल्स के नाम पूछे जो ऐसा करते हैं। उत्तर का सार केवल इसलिए है, "एक तीसरा पार्टी उपकरण है जिसे 'जेलर' कहा जाता है जो ऐसा करता है, इस URL पर।" यह लिंक ही वह सभी आवश्यक जानकारी प्रदान करता है; जोड़ने के लिए और कुछ नहीं है। यदि वह लिंक काम करना बंद कर देता है, तो यह आसानी से URL से अनुमान लगाया जा सकता है कि "प्रोग्राम को जेलर कहा जाता है," इसलिए इसे जोड़ना निरर्थक होगा।
पॉल लेगाटो

2
बेशक लिंक अब टूट गया है, और गूगल कोई विकल्प नहीं है।
ओवेन्समार्टिन

1
लिंक वर्तमान में मेरे लिए काम करता है, और "जेलर पोस्टग्रेज" के लिए Googling ने github.com/Wisser/Jailer को भी बदल दिया ।
पॉल लेगाटो

8
हो सकता है कि यदि आप howइस उपकरण का उपयोग करने में आपका एक उपयोगी विवरण जोड़ते हैं , तो हम यह समझने में सक्षम होंगे कि यह लक्ष्य कैसे प्राप्त करता है
ब्रायन ऐश
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.