एक अलग नाम से PostgreSQL डेटाबेस को निर्यात और आयात करें?


39

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

मैं PostgreSQL का उपयोग रेल के साथ कर रहा हूं और मैं अक्सर उत्पादन से डेटा निर्यात करता हूं, जहां डेटाबेस को blah_production कहा जाता है और इसे विकास पर आयात किया जाता है या नाम blah_development और blah_staging के साथ मंचन किया जाता है। MySQL पर यह तुच्छ है क्योंकि निर्यात में डेटाबेस कहीं भी नहीं है (एक टिप्पणी को छोड़कर), लेकिन PostgreSQL पर यह असंभव प्रतीत होता है। क्या यह असंभव है?

मैं वर्तमान में डेटाबेस को इस तरह डंप कर रहा हूं:

pg_dump blah > blah.dump

मैं -c या -C विकल्पों का उपयोग नहीं कर रहा हूं। उस डंप में इस तरह के कथन शामिल हैं:

COMMENT ON DATABASE blah IS 'blah';

ALTER TABLE public.checks OWNER TO blah;

ALTER TABLE public.users OWNER TO blah;

जब मैं आयात करने की कोशिश करता हूं

psql blah_devel < blah.dump

मुझे मिला

WARNING:  database "blah" does not exist

ERROR:  role "blah" does not exist

शायद समस्या वास्तव में डेटाबेस की नहीं बल्कि भूमिका की है?

अगर मैं इसे इस तरह से डंप करता हूं:

pg_dump --format=c blah > blah.dump

और इसे इस तरह से आयात करने का प्रयास करें:

pg_restore -d blah_devel < tmp/blah.psql

मुझे ये त्रुटियां मिलीं:

pg_restore: WARNING:  database "blah" does not exist
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 1513; 1259 16435 TABLE checks blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.checks OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1509; 1259 16409 TABLE users blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1508; 1259 16407 SEQUENCE users_id_seq blah
pg_restore: [archiver (db)] could not execute query: ERROR:  role "blah" does not exist
    Command was: ALTER TABLE public.users_id_seq OWNER TO blah;
pg_restore: [archiver (db)] Error from TOC entry 1824; 0 0 ACL public postgres
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: REVOKE ALL ON SCHEMA public FROM postgres;
pg_restore: [archiver (db)] could not execute query: ERROR:  role "postgres" does not exist
    Command was: GRANT ALL ON SCHEMA public TO postgres;
WARNING: errors ignored on restore: 11

कोई विचार?

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

जवाबों:


42

समाधान इसे इस तरह डंप कर रहा था:

pg_dump --no-owner --no-acl blah > blah.psql

और इसे इस तरह से आयात करना:

psql blah_devel < blah.psql > /dev/null

मुझे अभी भी यह चेतावनी मिलती है:

WARNING:  database "blah" does not exist

लेकिन बाकी काम करने लगता है।


2
आप एक जीवन रक्षक हैं :)
श्री हर्ष कप्पाला

जीवन रक्षक भाई :)
आप जानते हैं कि 16

11

यदि आप एक पाठ डंप बना रहे हैं, तो आप डेटाबेस को CREATE DATABASEबिट्स के बिना निर्यात कर सकते हैं (अर्थात निर्दिष्ट -cऔर Cविकल्प नहीं हैं pg_dump); यह Postgres को डेटाबेस से छोड़ने, बनाने और कनेक्ट करने की कोशिश करने से रोकेगा।

यदि आप संग्रह के किसी एक प्रारूप का उपयोग कर रहे हैं, तो आप उस डेटाबेस का नाम रखने का -dविकल्प निर्दिष्ट कर सकते हैं जिसे pg_restoreआप पुनर्स्थापित करना चाहते हैं।

अधिक विवरणों के लिए pg_dumpऔर उसके बाद मैन पेजों की जाँच करें, इससे पहले कि आप किसी महत्वपूर्ण विवरण को छोड़ दें मामले में उत्पादन प्रणालियों पर यह प्रयास करने से पहले pg_restoreएक खरोंच बंदर को माउंट करने के लिए मत भूलना ।


धन्यवाद। मैं -g को pg_restore के साथ देने का प्रयास करूँगा, लेकिन मैं इस समय के लिए हूं, इसे पाठ के रूप में डंप कर रहा हूं और pg_dump में मैं न तो -c निर्दिष्ट कर रहा हूं और न ही -C। मैं सिर्फ pg_dump डेटाबेससेन कह रहा हूं। क्या मैं कुछ भूल रहा हूँ?
पुतीनो

विकल्पों के साथ कोई pg_dumpऐसा डंप नहीं बनाया जाना चाहिए जिसे आप अपने डेटाबेस से कनेक्ट करते हैं जिसे आप कनेक्ट करते हैं (यह तब से कुछ समय है जब मैंने एक पाठ डंप किया था और एक अलग DB में पुनर्स्थापित किया था, लेकिन अगर पाठ डंप में SQL नहीं है CREATEऔर \connectबिट्स निष्पादित हो जाता है जहाँ भी जब आप आप कर रहे हैं \iडंप फ़ाइल ऑडेसिटी।
voretaq7

पाठ या बाइनरी मोड में pg_dump, डिफ़ॉल्ट रूप से, डेटाबेस नाम के उल्लेख के टन है।
पुतीनो

6

अब pg_restore के पास -d विकल्प है और आप डेटा आयात करने के लिए डेटाबेस का नाम सेट कर सकते हैं।

स्रोत पर :

pg_dump -v -Fc mydb.dmp mydb

भाग्य पर :

createb -T template1 mydb2

pg_restore -v -e -d mydb2 mydb.dmp


3
इस सिंटैक्स ने मेरे लिए काम किया: pg_dump -v -Fc mydb > mydb.dmp(pg_dump v9.4.5)।
पाओलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.