Postgres में एक डेटाबेस से दूसरे में टेबल कॉपी करें


273

मैं Postgres में एक डेटाबेस से दूसरे में एक पूरी तालिका को कॉपी करने की कोशिश कर रहा हूं। कोई सुझाव?


1
यदि आप DBeaver को स्थापित करने के साथ ठीक हैं, तो आपके द्वारा जुड़े दो डेटाबेसों के बीच स्थानांतरित करने का वास्तव में सरल तरीका है। बस स्रोत तालिका पर क्लिक करें और निर्यात डेटा का चयन करें, डेटाबेस तालिका को लक्षित करें और लक्ष्य को गंतव्य डेटाबेस के रूप में सेट करें।
रोजीको

जवाबों:


311

तालिका निकालें और इसे सीधे लक्ष्य डेटाबेस में डालें:

pg_dump -t table_to_copy source_db | psql target_db

नोट: यदि अन्य डेटाबेस में पहले से ही टेबल सेट है, तो आपको -aकेवल डेटा आयात करने के लिए ध्वज का उपयोग करना चाहिए , अन्यथा आपको "मेमोरी से बाहर" जैसी अजीब त्रुटियां दिखाई दे सकती हैं:

pg_dump -a -t my_table my_db | psql target_db

5
यह रिमोट-डीबी लिंक के लिए कैसे काम करेगा? उदाहरण के लिए, मुझे एक अलग स्थान से डंप करने की आवश्यकता है।
curlyreggie

17
@curlyreggie ने यह कोशिश नहीं की, लेकिन मुझे कोई कारण नहीं दिखता कि यह काम क्यों नहीं करेगा। कमांड में उपयोगकर्ता और सर्वर बारीकियों को जोड़ने की कोशिश करें, जैसेpg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
थोमैक्स

2
आप इसे आज़मा सकते हैं: "pg_dump -U Remote_user -h Remote_server -t table_to_copy source_db | psql target_db -U Remote_user -h Remote_server"
हुआ झांग

18
ध्यान दें कि यदि अन्य डेटाबेस में पहले से ही टेबल सेट है, तो आपको केवल डेटा के-a लिए ध्वज का उपयोग करना चाहिए । यानी । जब मैं यहाँ हूँ, यदि आपका डेटाबेस किसी सर्वर पर है, तो मुझे डेटाबेस को फ़ाइल में डंप करना आसान लगता है और फिर उस फ़ाइल को डेटाबेस में भेजना है, फिर फ़ाइल की सामग्री को psql पर भेजें। जैसे और अपने सर्वर पर डालने के बाद ->pg_dump -a -t my_table my_db | psql target_dbpg_dump -a -t my_table my_db > my_file.sqlpsql my_other_db < my_file.sql
निक ब्रैडी

3
@EamonnKenny केस-संवेदी तालिका डंप करने के लिए, करें pg_dump -t '"tableToCopy"' source_db | psql target_db:। ध्यान दें कि सिंगल और डबल कोट्स टेबल का नाम
घेरते हैं

105

आप pgAdmin II में बैकअप कार्यक्षमता का भी उपयोग कर सकते हैं। बस इन चरणों का पालन करें:

  • PgAdmin में, उस तालिका पर राइट क्लिक करें जिसे आप स्थानांतरित करना चाहते हैं, "बैकअप" चुनें
  • आउटपुट फ़ाइल के लिए निर्देशिका चुनें और प्रारूप को "सादे" पर सेट करें
  • "डंप विकल्प # 1" टैब पर क्लिक करें, "केवल डेटा" या "केवल स्कीमा" जांचें (आप क्या कर रहे हैं इसके आधार पर)
  • क्वेरीज़ अनुभाग के तहत, "कॉलम कॉलम सम्मिलित करें" और "उपयोगकर्ता सम्मिलित करें कमांड" पर क्लिक करें।
  • "बैकअप" बटन पर क्लिक करें। यह .backup फ़ाइल का आउटपुट देता है
  • नोटपैड का उपयोग करके इस नई फ़ाइल को खोलें। आप तालिका / डेटा के लिए आवश्यक सम्मिलित स्क्रिप्ट देखेंगे। PgAdmin में नए डेटाबेस sql पेज में कॉपी और पेस्ट करें। PgScript के रूप में चलाएं - क्वेरी-> pgScript F6 के रूप में निष्पादित करें

अच्छी तरह से काम करता है और एक बार में कई टेबल कर सकता है।


1
यह डेटाबेस के बीच डेटा ले जाने के लिए एक अच्छा गुई-आधारित समाधान है। धन्यवाद!
किलो मार्क्स

3
आप Objectsअनुभाग के तहत कई तालिकाओं का चयन कर सकते हैं । OSX पर, SQL बटन पर क्लिक करें या बैकअप फ़ाइल से कॉपी किए गए SQL में पेस्ट करने के SQL Editorलिए Toolsमेनू के माध्यम से प्राप्त करें ।
अलेक लैंडग्राफ

काम करता है, धन्यवाद। हालांकि बड़ी तालिकाओं पर बहुत धीमी गति से .. इसे तेज करने के लिए एक बेहतर तरीका है? (जैसे विदेशी कुंजियों या किसी चीज़ को नज़रअंदाज़ करना?)
टिमोसोलो

3
@ तीमुथियुस यहाँ डाक्यूमेंटेशन पेज पोस्ट कर रहा है कि कैसे बैक अप और रिस्टोर करने की गति बढ़ेगी
laurie

पुराना उत्तर लेकिन अभी भी प्रासंगिक है, महान काम करता है, बस सभी डेटाबेस को निर्यात करते समय अक्षम ट्रिगर सेट करना न भूलें
norbertas.gaulia

75

Dblink का उपयोग करना अधिक सुविधाजनक होगा!

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);

12
दो समय में दो dbname क्यों ..? कौन सा स्रोत और लक्ष्य है?
arulraj.net 15

1
तालिका जिसे हम सम्मिलित कर रहे हैं वह गंतव्य है, और dbLink में तालिका स्रोत है।
एग्रीगेट

अगर मैं dblink बन का उपयोग करना चाहता हूं तो मुझे स्रोत स्रोत तालिका की संरचना का पता नहीं है?
ओसारोट्टे

31

Psql का उपयोग करके, linux host पर, जिसमें दोनों सर्वर से कनेक्टिविटी है

( export PGPASSWORD=password1 
  psql -U user1 -h host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( export PGPASSWORD=password2 
  psql -U user2 -h host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )

निर्यात की कोई आवश्यकता नहीं है, PGPASSWORD=password1 psql -U ...तो आपको स्पष्ट उपधाराओं की भी आवश्यकता नहीं है! आमतौर पर, आप पहले सेट करने के लिए एक दो चीजें करना चाहेंगे, इसलिए सब-सब्सक्रिप्शन वैसे भी आवश्यक हो सकते हैं। इसके अलावा, पासवर्ड बाद की प्रक्रियाओं में निर्यात नहीं किया जाएगा। धन्यवाद!
सीमित प्रायश्चित

1
@ LimitedAtonement वास्तव में आप सही हैं, निर्यात और उपधारा आवश्यक नहीं है। यह केवल अधिक जटिल स्क्रिप्ट का एक हिस्सा है, और यहां तक ​​कि मैंने निर्यात और उपधाराओं के बिना कोशिश नहीं की, इसलिए, मैं इसे प्रदान करता हूं जैसा कि केवल ईमानदार होना है और काम किया समाधान प्रदान करना है
अलेक्सई Sviridov

तालिका गंतव्य DB में मौजूद होनी चाहिए। इसे बनाने के लिए, कोशिश करेंpg_dump -t '<table_name>' --schema-only
fjsj

24

पहले dblink इंस्टॉल करें

फिर, आप कुछ ऐसा करेंगे:

INSERT INTO t2 select * from 
dblink('host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);

1
यह उत्तर बहुत अच्छा है क्योंकि यह प्रतिलिपि की गई पंक्तियों को फ़िल्टर करने की अनुमति देता है (डब्लिंक 2 तर्क में जहां क्लॉज जोड़ें)। हालाँकि, किसी को स्तंभ नामों के बारे में स्पष्ट होना चाहिए (पोस्टग्रेज 9.4) कुछ के साथ: INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));(l का अर्थ है स्थानीय, आर रिमोट है। सिंगल सिंगल। एस्केप सिंगल कोट्स। कोल टाइप्स प्रदान करें।)
हैम्क्स

14

तालिका डेटा डंप करने के लिए pg_dump का उपयोग करें, और फिर इसे psql के साथ पुनर्स्थापित करें।


2
फिर कनेक्ट करने के लिए एक और डेटाबेसर का उपयोग करें, एक ऐसी भूमिका जिसमें पर्याप्त अनुमतियाँ हों। postgresql.org/docs/8.4/static/app-pgdump.html
फ्रैंक हाइकेंस

मैं क्या गलत कर रहा हूं? pg_dump -t "tablename" dbName --role "postgres"> db.sql "postgres" वह उपयोगकर्ता होगा जो मैं भूमिका निर्धारित करने का प्रयास कर रहा हूं। यह अभी भी मुझे "एक्सेस से वंचित है" देता है।
निक्स

क्या आपके पास db.sql फ़ाइल लिखने की अनुमति है?
जूल

मैं कैसे जाँचूँ कि मेरे पास क्या अनुमति है?
निक्स

यह धागा पुराना है, लेकिन किसी और को समस्या होने पर, PgAdminIII में 'टूल्स -> बैकअप' मेनू का उपयोग करने का प्रयास करें, जो कि अनुमति समस्याओं के आसपास लगता है।
जॉन

13

यदि आपके पास दोनों दूरस्थ सर्वर हैं तो आप इसका अनुसरण कर सकते हैं:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

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



8

यहाँ मेरे लिए क्या काम किया है। पहले फ़ाइल में डंप करें:

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

फिर डंप की गई फ़ाइल को लोड करें:

psql -U myuser -d second_db</tmp/table_dump

डंप लोड के लिए भी "
-एच

6

अपने स्थानीय सेटअप में डेटाबेस ए से डेटाबेस बी तक एक तालिका ले जाने के लिए, निम्नलिखित कमांड का उपयोग करें:

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2

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

1
@ मोम आप export PGPASSWORD=<passw>कमांड चलाने से पहले कर सकते हैं
lukaszzenko

4

मैंने यहां कुछ समाधानों की कोशिश की और वे वास्तव में मददगार थे। मेरे अनुभव में सबसे अच्छा समाधान psql कमांड लाइन का उपयोग करना है, लेकिन कभी-कभी मैं psql कमांड लाइन का उपयोग करने का मन नहीं करता। तो यहाँ pgAdminIII के लिए एक और समाधान है

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

इस पद्धति के साथ समस्या यह है कि फ़ील्ड और उनके प्रकार की तालिका का नाम जिसे आप कॉपी करना चाहते हैं, लिखा जाना चाहिए।


4

pg_dump हमेशा काम नहीं करता है।

यह देखते हुए कि आपके पास दोनों तालिकाओं में समान तालिका ddl है जिसे आप इसे stdout और stdin से हैक कर सकते हैं:

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"

3

User5542464 और पीयूष एस वानारे द्वारा जवाब के रूप में ही लेकिन दो चरणों में विभाजित:

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

अन्यथा पाइप एक ही समय में दो पासवर्ड पूछता है।


क्या ऐसी संभावना है कि मैं लक्ष्य डेटाबेस के तालिका नाम का उल्लेख कर सकता हूं?
पीयूष एस। वानारे

2

आपको एक टेबल डेटा को अलग-अलग डेटाबेस में दूसरी तालिका में कॉपी करने के लिए DbLink का उपयोग करना होगा। आपको क्रॉस डेटाबेस क्वेरी को निष्पादित करने के लिए DbLink एक्सटेंशन को स्थापित और कॉन्फ़िगर करना होगा।

मैंने पहले ही इस विषय पर विस्तृत पोस्ट बना लिया है। कृपया इस लिंक पर जाएँ


2

इस पाइथन स्क्रिप्ट की जाँच करें

python db_copy_table.py "host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);

1

यदि दोनों DBs (से और) पासवर्ड संरक्षित हैं, तो उस परिदृश्य में टर्मिनल दोनों DB के लिए पासवर्ड नहीं मांगेगा, पासवर्ड प्रॉम्प्ट केवल एक बार दिखाई देगा। तो, इसे ठीक करने के लिए, कमांड के साथ पासवर्ड पास करें।

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>

1

मैं DataGrip (Intellij Idea द्वारा) का उपयोग कर रहा था । और यह एक तालिका (एक अलग डेटाबेस में दूसरे के लिए) से डेटा की नकल करना बहुत आसान था।

पहले, सुनिश्चित करें कि आप डेटा ग्रिप में दोनों डेटा स्रोत के साथ जुड़े हुए हैं।

स्रोत तालिका का चयन करें और F5 दबाएं या (दायाँ क्लिक करें -> प्रतिलिपि तालिका का चयन करें)

यह आपको सभी तालिकाओं की एक सूची दिखाएगा (आप पॉपअप विंडो में तालिका नाम का उपयोग करके भी खोज कर सकते हैं)। बस अपना लक्ष्य चुनें और ओके दबाएं।

DataGrip आप के लिए सब कुछ संभाल लेंगे।


2
कृपया ध्यान दें, DataGrip एक मुक्त नहीं है !
रहमत अली

0

यदि आप Windows से pgAdmin (बैकअप: pg_dumpरिस्टोर :) चलाते हैं , तो pg_restoreयह फ़ाइल को डिफ़ॉल्ट रूप से आउटपुट करने का प्रयास करेगा c:\Windows\System32और इसीलिए आपको अनुमति / एक्सेस अस्वीकृत त्रुटि मिलेगी और इसलिए नहीं कि उपयोगकर्ता पोस्टग्रेज पर्याप्त रूप से उन्नत नहीं है। व्यवस्थापक के रूप में pgAdmin चलाएं या विंडोज के सिस्टम फ़ोल्डरों के अलावा आउटपुट के लिए कोई स्थान चुनें।


0

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.