PostgreSQL: एक ही डेटाबेस में डेटाबेस स्कीमा की पूरी प्रतिलिपि कैसे बनाएं?


26

मैं publicपूर्ण तालिका संरचना, डेटा, फ़ंक्शंस, fk, pk और आदि के साथ एक ही डेटाबेस में अपने स्कीमा की प्रतिलिपि कैसे बना सकता हूं ।
पोस्टग्रेज का मेरा संस्करण 8.4
PS है मुझे स्कीमा की प्रतिलिपि बनाने की आवश्यकता नहीं है डेटाबेस


क्या आपके पास अधिक स्कीमा हैं, या केवल public?
a_horse_with_no_name

मेरे पास सार्वजनिक और डेमो स्कीमा हैं। और मुझे डेमो अकाउंट बनाने के लिए डेमो कॉपी करने की आवश्यकता है ...

यह करने में सक्षम होने के लिए एक आसान बात होगी।
कुबेरचौं

जवाबों:


19

Pg_dump / pg_restore में ऐसा करने का कोई सरल तरीका नहीं है। यदि आप डेटाबेस को अस्थायी रूप से निकालने में सक्षम हैं, तो आप निम्न प्रयास कर सकते हैं।

  1. Pg_dump का उपयोग करके अपने सार्वजनिक स्कीमा का एक डंप लें
  2. "ALTER SCHEMA सार्वजनिक RENAME को public_copy पर चलाएँ"
  3. Pg_restore का उपयोग करके चरण 1 से अपने सार्वजनिक स्कीमा के अपने डंप को पुनर्स्थापित करें

मैं PHP के माध्यम से pg_dump और pg_restore तक कैसे पहुंच सकता हूं?

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

1
+1 यह अब तक का सबसे स्मार्ट समाधान है। शेल कमांड कुछ इस तरह दिखेगा ( मैनुअल में अधिक ) pg_dump -n my_schema -f '/path/to/file.pgsql' my_db:। सुपर -युसर के रूप में सबसे आसान ( postgres) में pw- कम peerप्राधिकरण के साथ pg_haba.conf। मूल स्कीमा का नाम बदलने के बाद पुनर्स्थापित करें psql my_db -f '/path/to/file.pgsql':। यदि आपके पास एक सादे एसक्यूएल डंप है, तो आपको ज़रूरत नहीं है pg_restore
इरविन ब्रांडस्टेटर

एक आसान तरीका है, मेरा जवाब देखें। एक स्कीमा चुनने के लिए pg_dump एक एन स्विच का समर्थन करता है। फिर डम्प और रीलोड में स्कीमा नाम को संपादित करें।
स्कॉट मारलो

2
बस स्कीमा का नाम बदलने से फ़ंक्शन के अंदर संदर्भ अपडेट नहीं होंगे: gist.github.com/pschultz/5387172 । नाम की जगह डंप बहुत अधिक विश्वसनीय है यदि आप अपनी खोज प्राप्त करते हैं और सही की जगह लेते हैं।
पीटर

9
pg_dump -n schema_name > dump.sql
vi dump.sql # edit the schema name
psql: psql -f dump.sql

यदि आप php से चिपके हुए हैं तो या तो बैक टिक्स का उपयोग करें

`/usr/bin/pg_dump-n myschema mydb -U username > /tmp/dump.sql`

या निष्पादित () कमांड। परिवर्तन के लिए आप उसी तरह सेड का उपयोग कर सकते हैं।

यहाँ 6 और वर्ण हैं


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

7

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

  1. स्कीमा नाम पर राइट-क्लिक करें जिसे आप कॉपी करना चाहते हैं और बैकअप पर क्लिक करें। (आप इस से अधिक गहराई तक जा सकते हैं और दोनों के बजाय केवल संरचना का बैकअप ले सकते हैं)।

  2. बैकअप फ़ाइल को एक नाम दें और एक प्रारूप भी चुनें। (मैं आमतौर पर टार का उपयोग करता हूं।)

  3. बैकअप पर क्लिक करें।

  4. आपके द्वारा समर्थित स्कीमा पर राइट-क्लिक करें और गुणों पर क्लिक करें और इसे अस्थायी रूप से कुछ और नाम दें। (जैसे temprename )

  5. स्कीमा रूट को क्लिक करें और ऑब्जेक्ट ब्राउज़र में राइट-क्लिक करें और नया स्कीमा बनाएं और स्कीमा को नाम सार्वजनिक करें । यह वह स्कीमा होगा जिसे आप अपने बैकअप से कॉपी कर रहे हैं।

  6. नया स्कीमा सार्वजनिक पर राइट-क्लिक करेंचरण 5 से को और पुनर्स्थापना पर क्लिक करें। चरण 3 में बैकअप फ़ाइल से पुनर्स्थापित करें।

  7. नए स्कीमा सार्वजनिक को एक अलग नाम (उदा। Newschema) का नाम बदलें ) का ।

  8. स्कीमा टेम्प्रनाम का नाम बदलें चरण 4 से मूल नाम पर वापस।


चरण 5 में बनाए गए नए स्कीमा का वही नाम होना चाहिए जिस स्कीमा का आपने बैकअप लिया है, अन्यथा pgAdmin कुछ भी पुनर्स्थापित नहीं करेगा।
काओ मिन्ह तू

5

आप उपयोग कर सकते हैं

CREATE DATABASE new_db TEMPLATE = old_db;

फिर उन सभी स्कीमाओं को छोड़ दें जिनकी आपको आवश्यकता नहीं है:

DROP SCHEMA public CASCADE;
DROP SCHEMA other CASCADE;

एकमात्र दोष पुराने_db के लिए सभी कनेक्शनों का निर्धारण किया जाना चाहिए इससे पहले कि आप प्रतिलिपि बना सकें (इसलिए CREATE DATABASEकथन को चलाने वाली प्रक्रिया को टेम्पलेट 1 से जोड़ना होगा)

यदि वह विकल्प नहीं है, तो pg_dump / pg_restore ही इसे करने का एकमात्र तरीका है।


1
इससे पहले कि मैं यह प्रश्न पूछूं, मैंने डेटाबेस को क्लोन करने की एक समान विधि का उपयोग किया। लेकिन यह बहुत समय बिताता है और मुझे लगता है कि केवल स्कीमा की क्लोनिंग बहुत तेज है ...

@sigra: क्लोनिंग की a_horse की विधि है डेटाबेस के लिए सबसे तेजी से उपलब्ध है, क्योंकि वास्तविक फ़ाइलें बस कॉपी किया जा सकता है, जो भूमि के ऊपर का एक बहुत बचाता है। मुझे संदेह है कि स्कीमा का एक डंप और पुनः लोड तेज होगा जब तक कि स्कीमा पूरे डीबी का केवल एक छोटा सा हिस्सा न हो। तो, इस उत्तर के लिए +1 भले ही वह पूछे गए वास्तविक प्रश्न का उत्तर न दे।
इरविन ब्रान्डेसटेटर

यह एक एकल स्कीमा को क्लोन करने के लिए बहुत काम है। स्कीमा को डंप करना, इसे डंप में फिर से नाम देना और पुनः लोड करना बहुत तेज है।
स्कॉट मारलो

@ScottMarlowe: इस पर निर्भर करता है कि सबसे बड़ा स्कीमा कौन सा है। अगर सबसे बड़ा गिरा हुआ है, तो मैं सहमत हूं।
a_horse_with_no_name

2

user1113185 उत्तर पर विस्तार , यहाँ psql / pg_dump का उपयोग करके एक पूर्ण वर्कफ़्लो है।

निम्नलिखित सभी वस्तुओं को निर्यात करता है old_schemaऔर उन्हें नए new_schemaस्कीमा में आयात करता है , जैसे userकि dbnameडेटाबेस में:

psql -U user -d dbname -c 'ALTER SCHEMA old_schema RENAME TO new_schema'
pg_dump -U user -n new_schema -f new_schema.sql dbname
psql -U user -d dbname -c 'ALTER SCHEMA new_schema RENAME TO old_schema'
psql -U user -d dbname -c 'CREATE SCHEMA new_schema'
psql -U user -q -d dbname -f new_schema.sql
rm new_schema.sql
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.