PostgreSQL डेटाबेस को दूसरे सर्वर पर कॉपी करना


492

मैं एक उत्पादन PostgreSQL डेटाबेस एक विकास सर्वर को कॉपी करने के लिए देख रहा हूँ। ऐसा करने के बारे में सबसे तेज़, सबसे आसान तरीका क्या है?

जवाबों:


666

आपको एक मध्यवर्ती फ़ाइल बनाने की आवश्यकता नहीं है। तुम कर सकते हो

pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

या

pg_dump -C -h remotehost -U remoteuser dbname | psql -h localhost -U localuser dbname

का उपयोग करना psqlया pg_dumpदूरस्थ होस्ट से कनेक्ट करना।

एक बड़े डेटाबेस या धीमे कनेक्शन के साथ, फ़ाइल को डंप करना और फ़ाइल को संपीड़ित करना तेज़ी से हो सकता है।

जैसा कि कोर्नेल ने कहा कि एक मध्यवर्ती फ़ाइल को डंप करने की कोई आवश्यकता नहीं है, यदि आप संकुचित काम करना चाहते हैं तो आप एक संपीड़ित सुरंग का उपयोग कर सकते हैं

pg_dump -C dbname | bzip2 | ssh  remoteuser@remotehost "bunzip2 | psql dbname"

या

pg_dump -C dbname | ssh -C remoteuser@remotehost "psql dbname"

लेकिन इस समाधान को भी दोनों सिरों में एक सत्र प्राप्त करने की आवश्यकता है।

नोट: pg_dump बैकअप के लिए है और psqlबहाल करने के लिए है। तो, इस उत्तर में पहला कमांड लोकल से रिमोट में कॉपी करना है और दूसरा रिमोट से लोकल में है । अधिक -> https://www.postgresql.org/docs/9.6/app-pgdump.html


28
मध्यवर्ती फ़ाइलों की कोई आवश्यकता नहीं है - आप संकुचित SSH सुरंग या बस पाइप का उपयोग कर सकते हैं: pg_dump | bzip2 | ssh "bunzip2 | pg_restore"
कोर्नेल

4
यदि आप bzip2 का उपयोग करते हैं, तो स्थानांतरण को गति देने के लिए ssh कम्प्रेशन को बंद करें!
लाजप

8
यदि मैं उत्पादन से डेटा को विकास में नीचे खींच रहा हूं तो मैं संपीड़ित कैसे काम कर सकता हूं ? मैंने उत्पादन में विकास से एसएसएच कनेक्शन स्थापित किया है। तो यह होगा ssh remoteuser@remotehost "pg_dump -C dbname | bzip2" | bunzip2 | psql dbname?
जेरॉमी फ्रेंच

2
मुझे उम्मीद है कि आपको नाम x के साथ स्थानीय डेटाबेस में नाम x के साथ एक दूरस्थ डेटाबेस की प्रतिलिपि बनाने में सक्षम होना चाहिए, लेकिन @ फेरन का समाधान इसके लिए काम नहीं करता है ... यह मुझे अश्लीलता के समाधान की तरह लग रहा है बस bzip2 फ़ाइलों को छोड़ देता है सर्वर, इसलिए यह एक कदम प्रक्रिया नहीं है। यह मामला होने के नाते, मुझे लगता है कि मैं डेटाबेस y को छोड़ दूंगा, फेरन के समाधान के "या" भाग का उपयोग करता हूं जो x को पुनर्स्थापित करता है, फिर डेटाबेस को y पर नाम दें।
डारिन पीटरसन

3
यह मैंने क्या किया है: (1) pg_dump -C -h Remotehost -U Remoteuser x | psql -h localhost -U localuser (2) dropdb y (3) psql -U पोस्टग्रेजेस -c 'ALTER DATABASE "x" RENAME TO "y"
डारिन पीटरसन

131
pg_dump the_db_name > the_backup.sql

फिर बैकअप को अपने डेवलपमेंट सर्वर पर कॉपी करें, इसके साथ रिस्टोर करें:

psql the_new_dev_db < the_backup.sql

3
किसी ने मुझे बताया कि यह समस्याग्रस्त हो सकता है - अनुमतियाँ समस्याएँ या तो डंप का कारण बनती हैं या जब यह एक ट्रिगर को मारता है तो मर जाता है?
रॉबिन बार्न्स

17
@rmbarnes: यदि समस्याएं हैं - तो उन्हें ठीक करना होगा। विस्तृत ज्ञान के बिना यह "कुछ एक" ने किया - कोई भी इस दावे की पुष्टि नहीं कर सकता और न ही खारिज कर सकता है।

4
Pg_dump के साथ -no-स्वामी ध्वज का उपयोग करें यह समस्या को छोड़ देता है और इस पोस्ट के पहले संपादन ने इसका उपयोग किया - लेकिन फिर मैंने सोचा कि आपको मूल डेटाबेस में अधिक सटीक निष्ठा की आवश्यकता हो सकती है।
को अनमाउंट

4
Psql -h मेजबान यू उपयोगकर्ता नाम db_name <dump_schema_and_data_file: pg_dump -सी -h मेजबान यू उपयोगकर्ता नाम db_name> / any_directory / dump_schema_and_data_file .और फ़ाइल से बहाल करने के लिए: मेरे लिए, दृष्टिकोण से ऊपर निम्नलिखित तरीके से काम किया
अली रजा भयानी

इससे मुझे बहुत नुकसान हुआ। मैंने मशीनों के बीच फ़ाइल को स्थानांतरित करने के लिए Google ड्राइव का उपयोग किया। चूंकि मेरे पास पहले से ही नई मशीन पर डेटाबेस था (लेकिन रिक्त) मुझे बहुत सी डुप्लिकेट कुंजी त्रुटियों का सामना करना पड़ा। हालांकि, यह एक देव माहौल है और उन्होंने कुछ भी चोट नहीं पहुंचाई।
क्रिस मेंडला

37

Pg_dump , और बाद में psql या pg_restore का उपयोग करें - यह निर्भर करता है कि आप pg_dump को -Fp या -Fc विकल्प चुनते हैं या नहीं।

उपयोग का उदाहरण:

ssh production
pg_dump -C -Fp -f dump.sql -U postgres some_database_name
scp dump.sql development:
rm dump.sql
ssh development
psql -U postgres -f dump.sql

22

यदि आप संस्करणों के बीच माइग्रेट करना चाहते हैं (जैसे आपने पोस्टग्रैज अपडेट किए हैं और 9.1 लोकलहोस्ट पर चल रहे हैं: 5432 और 9.3 लोकलहोस्ट पर चल रहे हैं: 5434) आप चला सकते हैं:

pg_dumpall -p 5432 -U myuser91 | psql -U myuser94 -d postgres -p 5434

की जाँच करें माइग्रेशन डॉक्स


(Myuser91 / postgres) के लिए मुझसे कई बार पूछा जाता है, क्या कोई ऐसा तरीका है, जिससे मुझे केवल एक बार पासवर्ड दर्ज करने की आवश्यकता हो?
मार्टिन वेबर

@MartinWeber इस दस्तावेज़ के अनुसार एक, pgpass फ़ाइल बनाएँ postgresql.org/docs/9.4/static/libpq-pgpass.html
Scott Warren

क्या होगा अगर उनके दोनों समान पोर्ट हैं?
ggnoredo

यदि वे विभिन्न सर्वरों पर हैं, तो आप मेजबानों को निर्दिष्ट करने के लिए -h का उपयोग कर सकते हैं।
हेरोल्डो_को

16

pg_basebackup अब ऐसा करने का बेहतर तरीका लगता है, खासकर बड़े डेटाबेस के लिए।

आप उसी या पुराने प्रमुख संस्करण वाले सर्वर से डेटाबेस की प्रतिलिपि बना सकते हैं। या अधिक सटीक :

pg_basebackupउसी या पुराने प्रमुख संस्करण के सर्वर के साथ काम करता है, नीचे 9.1 तक। हालाँकि, वाल स्ट्रीमिंग मोड ( -X stream) केवल सर्वर संस्करण 9.3 और बाद के संस्करण के साथ काम करता है, और --format=tarवर्तमान संस्करण का टार फॉर्मेट मोड केवल सर्वर संस्करण 9.5 या बाद के संस्करण के साथ काम करता है।

उसके लिए आपको सोर्स सर्वर पर चाहिए:

  1. listen_addresses = '*'लक्ष्य सर्वर से कनेक्ट करने में सक्षम होना। सुनिश्चित करें कि पोर्ट 5432 उस मामले के लिए खुला है।
  2. कम से कम 1 उपलब्ध प्रतिकृति कनेक्शन: max_wal_senders = 1( -X fetch), 2के लिए -X stream(PostgreSQL 12 के मामले में डिफ़ॉल्ट), या अधिक।
  3. wal_level = replicaया उच्चतर सेट करने में सक्षम होने के लिए max_wal_senders > 0
  4. host replication postgres DST_IP/32 trustमें है pg_hba.conf। यह मशीन pgसे किसी को भी क्लस्टर तक पहुँच देता है DST_IP। आप अधिक सुरक्षित विकल्प का सहारा लेना चाह सकते हैं।

परिवर्तन 1, 2, 3 को सर्वर पुनरारंभ की आवश्यकता है, परिवर्तन 4 को पुनः लोड करने की आवश्यकता है।

लक्ष्य सर्वर पर:

# systemctl stop postgresql@VERSION-NAME
postgres$ pg_basebackup -h SRC_IP -U postgres -D VERSION/NAME --progress
# systemctl start postgresql@VERSION-NAME

11
क्या आप अपने उत्तर में अधिक विवरण प्रदान कर सकते हैं, जैसे एक उदाहरण?
21

7
यह तभी काम करता है जब दोनों मशीनों में समान पीजी संस्करण हों, हालांकि।
sm

संभावनाएं छोटी हैं कि आप विकास और उत्पादन के लिए विभिन्न डेटाबेस संस्करण का उपयोग करेंगे। पिछली बार मैंने अपने एक साथी के साथ कुछ अप्रिय बातचीत की थी क्योंकि वह एक मुद्दा प्रस्तुत करने की कोशिश कर रही थी कि कुछ कोड PG 9.6 के साथ काम नहीं कर रहे हैं जबकि हमने उस समय उत्पादन में 9.5 का उपयोग किया था। बेस बैकअप ज्यादा तेज है। तब pg_upgrad जाने का जरिया है।
जोर्ग

2
संभावना है कि आप एक नए संस्करण में माइग्रेट करना चाहते हैं, और PostgreSQL को रोकना नहीं चाहते हैं।
x- यूरी

1
संभावना है कि जब भी आप अपने डेटाबेस को अपग्रेड करते हैं, तो आप इसे उत्पादन पर करने से पहले देव और मंचन पर अपग्रेड करते हैं।
andrew lorien

8

डेटाबेस नाम के साथ इस कमांड को चलाएं, आप DB का डंप लेने के लिए बैकअप लेना चाहते हैं।

 pg_dump -U {user-name} {source_db} -f {dumpfilename.sql}

 eg. pg_dump -U postgres mydbname -f mydbnamedump.sql

अब इस डंप फ़ाइल को दूरस्थ मशीन पर भेजें जहाँ आप DB की प्रतिलिपि बनाना चाहते हैं।

eg. scp mydbnamedump.sql user01@remotemachineip:~/some/folder/

रिमोट मशीन पर डीबी को पुनर्स्थापित करने के लिए ~ / कुछ / फ़ोल्डर में कमांड का पालन करें।

 psql -U {user-name} -d {desintation_db}-f {dumpfilename.sql}

 eg. psql -U postgres -d mynewdb -f mydbnamedump.sql

7

मैंने काफी संघर्ष किया और अंततः वह विधि जिसने मुझे रेल 4 के साथ काम करने की अनुमति दी:

अपने पुराने सर्वर पर

sudo su - postgres
pg_dump -c --inserts old_db_name > dump.sql

मुझे डंप बनाने के लिए पोस्टग्राउंड लिनक्स उपयोगकर्ता का उपयोग करना पड़ा। मुझे भी नए सर्वर पर डेटाबेस के निर्माण के लिए -c का उपयोग करना पड़ा। --inserts इसे INSERT () सिंटैक्स का उपयोग करने के लिए कहता है जो अन्यथा मेरे लिए काम नहीं करेगा :(

फिर, नए सर्वर पर, simpy:

sudo su - postgres
psql new_database_name < dump.sql

सर्वर के बीच डंप। एससीएल फ़ाइल को स्थानांतरित करने के लिए मैंने केवल सामग्री को प्रिंट करने के लिए "नैनो" का उपयोग किया और सामग्री को कॉपी करने के लिए इसे "नैनो" से फिर से बनाया।

इसके अलावा, दो डेटाबेस पर उपयोग कर रहा था मैं अलग था इसलिए मुझे डंप में सभी मालिक का नाम ढूंढना पड़ा।


6

अपना डेटाबेस डंप करें: pg_dump database_name_name > backup.sql


अपने डेटाबेस को वापस आयात करें: psql db_name < backup.sql


5

मुझे अपने टेबल डेटा को एक सर्वर से दूसरे PostgreSQL सर्वर पर कॉपी करने के लिए एक लिनक्स शेल स्क्रिप्ट साझा करने दें।

इस ब्लॉग से लिया गया संदर्भ:

PostgreSQL सर्वर के बीच डेटा माइग्रेशन के लिए लिनक्स बैश शैल स्क्रिप्ट:

#!/bin/bash
psql \
    -X \
    -U user_name \
    -h host_name1 \
    -d database_name \
    -c "\\copy tbl_Students to stdout" \
| \
psql \
    -X \
    -U user_name \
    -h host_name2 \
    -d database_name \
    -c "\\copy tbl_Students from stdin"

मैं सिर्फ डेटा माइग्रेट कर रहा हूं; कृपया अपने गंतव्य / दूसरे डेटाबेस सर्वर पर एक खाली तालिका बनाएँ।

यह एक यूटिलिटी स्क्रिप्ट है। इसके अलावा, आप सामान्य उपयोग के लिए स्क्रिप्ट को संशोधित कर सकते हैं जैसे host_name, database_name, table_name और अन्य के लिए पैरामीटर जोड़कर


5

स्वीकृत उत्तर सही है, लेकिन यदि आप संवादात्मक रूप से पासवर्ड दर्ज करने से बचना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

PGPASSWORD={{export_db_password}} pg_dump --create -h {{export_db_host}} -U {{export_db_user}} {{export_db_name}} | PGPASSWORD={{import_db_password}} psql -h {{import_db_host}} -U {{import_db_user}} {{import_db_name}}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.