2010-11-16 15 views
34

प्रिय सभी,
मैं एक डेटाबेस नामित temp1
की एक डंप ले लिया है follwing आदेश का उपयोगमैं एक अलग स्कीमा

$ pg_dump -i -h localhost -U postgres -F c -b -v -f pub.backup temp1 

अब मैं एक अलग में डंप पुनर्स्थापित करना चाहते हैं के साथ डेटाबेस पुनर्स्थापित करना चाहते हैं डेटाबेस "db_temp" कहा जाता है, लेकिन उसमें मैं बस चाहता हूं कि सभी टेबल "temp_schema" (डिफ़ॉल्ट स्कीमा जो fms temp1 डेटाबेस में है) में "db_temp" डेटाबेस में नहीं होना चाहिए।

क्या pg_restore कमांड
का उपयोग करके ऐसा करने का कोई तरीका है किसी अन्य विधि की भी सराहना की जा सकती है!
अग्रिम धन्यवाद!

+6

मैं स्वीकार नहीं कर सकता कि यह अभी भी 2017 में हो रहा है, और समाधान डंप फ़ाइल हैक करना है। – Sharky

उत्तर

9

pg_restore में कोई रास्ता नहीं है। आप क्या कर सकते हैं SQL आउटपुट उत्पन्न करने के लिए pg_restore का उपयोग करें, और उसके बाद इसे बदलने के लिए इसे एक sed स्क्रिप्ट के माध्यम से भेजें। आपको इस बारे में सावधान रहना होगा कि आप उस स्क्रिप्ट स्क्रिप्ट को कैसे लिखते हैं, इसलिए यह आपके डेटा के अंदर चीजों से मेल नहीं खाता है और बदलता है।

7

शायद सबसे आसान तरीका बस निम्नलिखित एसक्यूएल के साथ यानी के बाद स्कीमा का नाम बदलने, बहाल करने के लिए होगा:

ALTER SCHEMA my_schema RENAME TO temp_schema 

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

+0

यह समाधान बहुत गड़बड़ कर सकता है यह – abubacker

+3

किस तरह से है ?? स्कीमा नाम बदलने का एकमात्र सुरक्षित तरीका SQL कथन है। अन्य समाधान को एक और उत्तर में भी सुझाव दिया गया है और हम दोनों समझाते हैं कि यह जोखिम भरा है। गरीब डाउनवॉटिंग। – Hamish

+1

मैंने स्कीमा नाम बदल दिया लेकिन उसके बाद, मैं सेराच पथ को बदलने में सक्षम नहीं हूं! उपयोगकर्ता नाम के बाद किसी भी तालिका को खोजने में सक्षम नहीं है! –

3

यदि आपके पास केवल कुछ टेबल हैं, तो आप pg_restore-d database स्वीकार करते समय -t tablename स्वीकार करते समय एक तालिका को पुनर्स्थापित कर सकते हैं। बेशक, आपको टेबल को बहाल करने से पहले स्कीमा सेट करना होगा और फिर टेबल को बहाल करने के बाद इंडेक्स और बाधाओं को सॉर्ट करना होगा।

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

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

32

एक त्वरित और गंदा तरीका:

1) का नाम बदलने डिफ़ॉल्ट स्कीमा:

alter schema public rename to public_save; 

2) डिफ़ॉल्ट स्कीमा के रूप में नए स्कीमा बनाने के लिए:

create schema public; 

3) को बहाल डेटा

pg_restore -f pub.backup db_temp [and whatever other options] 

4) नाम बदलें ई स्कीमा की आवश्यकता के अनुसार:

alter schema public rename to temp_schema; 
alter schema public_save rename to public; 
44

वहाँ एक सरल उपाय है:

  • सादा एसक्यूएल प्रारूप में अपने बैकअप डंप (प्रारूप "पी" पैरामीटर का उपयोग कर "--format = पी" या "बनाएं एफ पी ")
  • संपादित अपने pub.backup.sql अपने पसंदीदा संपादक के साथ डंप और अपनी फ़ाइल के शीर्ष पर निम्नांकित दो पंक्तियों को जोड़ें:

स्कीमा बनाने myschema;

एसईटी search_path to myschema;

अब आप

psql कमांड के साथ अपने बैकअप डंप बहाल कर सकते हैं -f pub.backup.sql

"search_path सेट करने के लिए" कमांड डिफ़ॉल्ट के रूप में myschema सेट हो जाएगा, ताकि इस स्कीमा में नई टेबल और अन्य ऑब्जेक्ट्स स्वतंत्र रूप से "डिफ़ॉल्ट" स्कीमा से बनाई गई हों जहां वे पहले रहते थे।

+0

क्या वास्तव में केवल एक बड़ी डंप फ़ाइल के सिर को संपादित करने का एक साफ तरीका है? यहां तक ​​कि इस तरह की चीजों को भी डुप्लिकेट करना शामिल है: http: // superuser।कॉम/प्रश्न/246837/कैसे-करें-i-add-text-to-the-an-file-in-bash –

+0

@PeterEhrlich आपकी फाइलें कितनी बड़ी हैं और उपलब्ध रैम के आधार पर, आप विम का उपयोग कर सकते हैं सीधे एक gzip'd डंप फ़ाइल खोलें। यह अभी भी स्मृति में विस्तारित हो जाता है लेकिन मैं 750 एमबी (.gz) फ़ाइल को खोलने, संपादित करने और सहेजने में सक्षम था, जबकि सहेजते समय केवल एक छोटा विराम था। YMMV। – David

+0

मैंने पाया कि मेरे डंप में पहले से एक या अधिक एसईटी search_path था ...; लाइनें जिन्हें मुझे हटाने की जरूरत है। संपादन और पहले बहाल करने से पहले आप "search_path" खोजना चाहेंगे। आपके पास कम से कम एक SET search_path होगा ...; प्रत्येक स्कीमा के लिए लाइन जिसमें से वस्तुओं को डंप किया गया था। यह अच्छा होगा अगर कोई --without-schema विकल्प था जो --no-owner विकल्प की तरह काम करता था। – David

0

एक अस्थायी डेटाबेस में स्कीमा का नाम बदलें।

निर्यात स्कीमा:

pg_dump --schema-only --schema=prod > prod.sql 

एक नया डेटाबेस बनाने के लिए। निर्यात पुनर्स्थापित करें:

psql -f prod.sql 

ALTER SCHEMA prod RENAME TO somethingelse; 

pg_dump --schema-only --schema=somethingelse > somethingelse.sql 

(डेटाबेस को हटाने)

डेटा के लिए तुम सिर्फ शीर्ष पर सेट search_path संशोधित कर सकते हैं।

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