मैं अपने स्थानीय परीक्षण डेटाबेस में एक prodution डेटाबेस से tabledata का सबसेट कैसे निर्यात कर सकता हूं?


10

हमारे पास अपेक्षाकृत बड़ा उत्पादन पोस्टग्रेज आधारित डीबी: ~ 20 जीबी है। PostgreSQL डेटाबेस heroku पर होस्ट किया गया है।

मैं अपने स्थानीय डेटाबेस में तालिका डेटा के एक छोटे उपसमूह को कॉपी करना चाहूंगा ताकि मैं उत्पादन पर काम किए बिना उन पर कुछ परीक्षण चला सकूं।

मैं स्वयं नमूना डेटा उत्पन्न नहीं करना चाहता, बल्कि उस डेटा का उपयोग करना चाहता हूं जो उत्पादन वातावरण में पहले से मौजूद है।

डेटाबेस में प्रत्येक तालिका से 100 पंक्तियाँ पर्याप्त होंगी। क्या इसे पूरा करने का एक आसान तरीका है?


1
जिज्ञासा से बाहर, 20GB बहुत अधिक डिस्क स्थान क्यों है? मैं अपने DB पर मेरे परीक्षण डिस्क पर 100 DB आवंटित किया है बस DB खरोंच स्थान के लिए।
jcolebrand

चूंकि मैं कभी-कभी अपने बाहरी एचडी को अपने साथ नहीं ले जाता हूं, मेरे ssd बस पर्याप्त स्थान प्रदान नहीं करता है। साथ ही मुझे वास्तव में केवल मेरे db से नमूना डेटा की आवश्यकता है, और पूरे db की नहीं।
jottr

1
उचित पर्याप्त है, लेकिन मैं आपको रचनात्मक पाने के लिए प्रोत्साहित करता हूं। एसडी स्लॉट में फिट होने के लिए एसडी कार्ड पर विचार करें, क्योंकि मुझे कभी भी अधिक डेटा होने के साथ कोई समस्या नहीं हुई है :-) लेकिन यह चूसना है: - \ _ मेरा निजी लैपटॉप यह अंतिम मुफ्त 10GB है।
jcolebrand

जवाबों:


3

मैंने इस टूल का उपयोग नहीं किया है, लेकिन जेलर ने ऐसा करने का वादा किया है

डेटाबेस सबसेटिंग और ब्राउजिंग टूल। संबंधित डेटाबेस (JDBC) से सुसंगत, संदर्भित रूप से अक्षुण्ण पंक्तियों को निर्यात करता है

http://sourceforge.net/projects/jailer/


1

जेलर इस स्थिति में मदद कर सकता है। मैं आपके जैसे ही काम कर रहा हूं (प्रत्येक तालिका के ~ 100 रिकॉर्ड प्राप्त करने की कोशिश कर रहा हूं) और यहां मैंने जो कदम उठाए हैं, वे हैं: - मूल निकाय (वह जो लगभग तालिकाओं से जुड़ा हुआ है) का पता लगाएं और रिकॉर्डों के सबसेट को प्राप्त करें रूट पंक्ति (जैसे रूट लोग हैं, फिर मैं सभी संबंधित रिकॉर्ड लोगों के लिए देखूंगा। यह = 1 ...) - चरण 1 को समाप्त करने के बाद, फिर से एक अन्य तालिका (जिसे आप 100 रिकॉर्ड करना चाहते हैं) के साथ शुरू करें ) और इसके परिणाम से उपसमुच्चय प्राप्त करें।


1

एक अन्य विकल्प यह है कि मैं अभी हाल ही में आया हूं (दी गई, मैं इसका उपयोग करना अभी बाकी हूं, लेकिन जल्द ही योजना बनाऊंगा): rdbms-subsetter :।

यह जेलर की तुलना में थोड़ा सरल और हल्का है, जिसमें कुछ अच्छी विशेषताएं / भत्ते हैं:

  • CLI मौजूदा टूलींग को तार करना इतना आसान है
  • खुला स्त्रोत
  • एक सुसंगत लाने के लिए विदेशी कुंजी का पालन करेंगेडेटा की सबसेट
    • यदि आपके पास अच्छी तरह से परिभाषित विदेशी कुंजी नहीं है, तो रिश्तों को JSON कॉन्फ़िग फ़ाइल के माध्यम से प्रदान किया जा सकता है। मेरे मामले में, मैं स्कीमा मेटाडाटा से कहीं और संग्रहीत इस विन्यास को उत्पन्न करने की योजना (धन्यवाद, रेल: \)
  • आप एक विशिष्ट पंक्ति को लक्षित कर सकते हैं और सभी प्राप्त कर सकते हैं संबंधित रिकॉर्ड (जैसे एक विशिष्ट ग्राहक के पास समस्याएँ हैं, इसलिए आप स्थानीय स्तर पर उनके खाते के डेटा को सुलभ बनाने के लिए सब कुछ नीचे खींच सकते हैं)
  • यह या तो प्रति तालिका लगातार रिकॉर्ड ले सकता है या बिना किसी अतिरिक्त जानकारी के बड़े तालिकाओं से अधिक डेटा प्राप्त करने के लिए एक लघुगणक ले सकता है।

यह विशेष रूप से हेरोकू डेटाबेस के लिए एक और विकल्प का उल्लेख करने योग्य है, जिसका मैंने बहुत उपयोग किया है (जैसा कि मैं वहां काम करता था)।

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

$ heroku addons:create heroku-postgres[:specific-plan] \
    --fork your-production-app::DATABASE \
    --app some-other-app-to-own-forked-database \
    [--as PRODUCTION_SNAPSHOT]

फिर, आप अपने ऐप को स्थानीय रूप से उस स्नैपशॉट को इंगित कर सकते हैं। मैं इसका उपयोग अक्सर डेटा या स्कीमा माइग्रेशन या डिबग ग्राहक समस्याओं का सूखा चलाने के लिए करता हूं।

ऊपर दिए गए कमांड में, यदि आपके पास एक डीबी सुलभ DATABASE_URLहै your-production-app, PRODUCTION_SNAPSHOT_URLतो आप --asनाम के एक अलग ऐप पर (यदि आप निर्दिष्ट करते हैं ) के साथ डीबी सुलभ हो जाएगा some-other-app-to-own-forked-database


0

पंक्तियों का एक यादृच्छिक सेट प्राप्त करने के लिए आप इस तरह से LIMIT का उपयोग कर सकते हैं :

SELECT * FROM my_table LIMIT 100

यह सबसे आसान है और सिर्फ 100 पहली पंक्तियों को चुन लेगा जो PostreSQL में आया था। यह 100 अंतिम डाला या शायद पहले 100 हो सकता है। यदि आपको वास्तव में यादृच्छिक कुछ चाहिए, तो इस Stackoverflow जवाब को देखें


मदद करने की कोशिश करने के लिए धन्यवाद, लेकिन यह मेरे सवाल का जवाब नहीं देता है।
jottr

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

1
@elementz - क्या कोई कारण है कि आप तालिकाओं पर सिर्फ लूप नहीं कर सकते हैं और COPY (SELECT ... LIMIT 100) से 'फाइलनाम' तक ...? क्या आप हरोकू में कॉपी नहीं कर सकते?
rfusca

@rfusca - मुझे पता नहीं था कि COPY अस्तित्व में है। मैं कोशिश करूंगा और रिपोर्ट करूंगा।
जॉटर

3
@rfusca: एक साधारण का उपयोग LIMITFK संदर्भों के साथ नहीं होगा। उदाहरण के लिए: ऑर्डर टेबल से 100 पंक्तियों में ऐसे ग्राहक शामिल हो सकते हैं जो ग्राहक तालिका से 100 पंक्तियों का निर्यात करते समय मौजूद नहीं होते हैं।
a_horse_with_no_name 18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.