ฉันพยายามที่จะคัดลอกตารางทั้งหมดจากฐานข้อมูลหนึ่งไปยังอีกใน Postgres ข้อเสนอแนะใด ๆ
ฉันพยายามที่จะคัดลอกตารางทั้งหมดจากฐานข้อมูลหนึ่งไปยังอีกใน Postgres ข้อเสนอแนะใด ๆ
คำตอบ:
แยกตารางและไพพ์ไปยังฐานข้อมูลเป้าหมายโดยตรง:
pg_dump -t table_to_copy source_db | psql target_db
หมายเหตุ:หากฐานข้อมูลอื่นมีตารางติดตั้งอยู่แล้วคุณควรใช้-a
แฟล็กเพื่อนำเข้าข้อมูลเท่านั้นมิฉะนั้นคุณอาจเห็นข้อผิดพลาดแปลก ๆ เช่น "หน่วยความจำไม่เพียงพอ":
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
ธงสำหรับข้อมูลเท่านั้น pg_dump -a -t my_table my_db | psql target_db
กล่าวคือ ขณะที่ฉันอยู่ที่นี่หากฐานข้อมูลของคุณอยู่บนเซิร์ฟเวอร์ฉันพบว่าง่ายกว่าที่จะถ่ายโอนฐานข้อมูลไปยังไฟล์แล้ว scp ไฟล์นั้นไปยังฐานข้อมูลจากนั้นส่งเนื้อหาของไฟล์ไปยัง psql เช่นpg_dump -a -t my_table my_db > my_file.sql
และหลังจากวางลงบนเซิร์ฟเวอร์ของคุณ ->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
ไปทำ: โปรดทราบว่าคำพูดเดี่ยวและคู่ล้อมรอบชื่อตาราง
คุณยังสามารถใช้ฟังก์ชันการสำรองข้อมูลใน pgAdmin II เพียงทำตามขั้นตอนเหล่านี้:
ทำงานได้ดีและสามารถทำหลาย ๆ ตารางในเวลาเดียวกัน
Objects
ส่วน บน OSX คลิกปุ่ม SQL หรือรับSQL Editor
ผ่านทางTools
เมนูเพื่อวางลงใน SQL ที่คัดลอกมาจากไฟล์สำรอง
การใช้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);
ใช้ psql บนโฮสต์ linux ที่มีการเชื่อมต่อกับเซิร์ฟเวอร์ทั้งสอง
( 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 ...
จากนั้นคุณไม่จำเป็นต้องมี subshells ชัดเจนอีกด้วย! โดยปกติคุณจะต้องทำสองสิ่งเพื่อตั้งค่าก่อนดังนั้นจึงจำเป็นต้องมี subshells นอกจากนี้รหัสผ่านจะไม่ถูกส่งออกไปยังกระบวนการที่ตามมา ขอบคุณ!
pg_dump -t '<table_name>' --schema-only
ขั้นแรกให้ติดตั้ง 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
);
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 หมายถึงท้องถิ่น r คือระยะไกลหนีราคาเดียวให้บริการประเภทพ...)
ใช้ pg_dump เพื่อดัมพ์ข้อมูลตารางจากนั้นกู้คืนด้วย psql
หากคุณมีเซิร์ฟเวอร์ระยะไกลทั้งคู่คุณสามารถทำตามสิ่งนี้:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
มันจะคัดลอกตารางดังกล่าวของฐานข้อมูลต้นทางลงในตารางชื่อเดียวกันของฐานข้อมูลเป้าหมายหากคุณมีสคีมาอยู่แล้ว
คุณสามารถทำสิ่งต่อไปนี้:
pg_dump -h <host ip address> -U <host db user name> -t <host table> > <host database> | psql -h localhost -d <local database> -U <local db user>
นี่คือสิ่งที่ใช้ได้ผลสำหรับฉัน ดัมพ์แรกไปยังไฟล์:
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
หากต้องการย้ายตารางจากฐานข้อมูล A ไปยังฐานข้อมูล B ที่การตั้งค่าท้องถิ่นของคุณให้ใช้คำสั่งต่อไปนี้:
pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2
export PGPASSWORD=<passw>
ก่อนรันคำสั่ง
ฉันลองวิธีแก้ปัญหาบางอย่างที่นี่และพวกเขามีประโยชน์จริง ๆ ในประสบการณ์ของฉันทางออกที่ดีที่สุดคือการใช้บรรทัดคำสั่ง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
)
)
ปัญหาของวิธีนี้คือต้องเขียนชื่อของเขตข้อมูลและประเภทของตารางที่คุณต้องการคัดลอก
pg_dump
ไม่ทำงานเสมอ
ระบุว่าคุณมีตาราง ddl เดียวกันใน dbs ทั้งสองคุณสามารถแฮ็กมันจาก 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"
เหมือนกับคำตอบโดยuser5542464และPiyush S. Wanareแต่แยกออกเป็นสองขั้นตอน:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
มิฉะนั้นไพพ์จะถามรหัสผ่านสองตัวในเวลาเดียวกัน
คุณต้องใช้ DbLink เพื่อคัดลอกข้อมูลหนึ่งตารางไปยังตารางอื่นที่ฐานข้อมูลที่แตกต่างกัน คุณต้องติดตั้งและกำหนดค่าส่วนขยาย DbLink เพื่อดำเนินการค้นหาข้ามฐานข้อมูล
ฉันได้สร้างโพสต์โดยละเอียดในหัวข้อนี้แล้ว กรุณาเยี่ยมชมลิงค์นี้
ตรวจสอบสคริปต์หลามนี้
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);
หากฐานข้อมูลทั้งสอง (จาก & ถึง) ได้รับการป้องกันด้วยรหัสผ่านในเทอร์มินัลสถานการณ์จำลองจะไม่ถามรหัสผ่านสำหรับทั้งสองฐานข้อมูลการแจ้งเตือนรหัสผ่านจะปรากฏเพียงครั้งเดียว ดังนั้นเพื่อแก้ไขปัญหานี้ให้ส่งรหัสผ่านพร้อมกับคำสั่ง
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
ฉันใช้DataGrip (โดย Intellij Idea) และมันเป็นเรื่องง่ายมากที่จะคัดลอกข้อมูลจากตารางหนึ่ง (ในฐานข้อมูลที่แตกต่างไปยังอีก)
ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณเชื่อมต่อกับแหล่งข้อมูลทั้งสองใน Data Grip แล้ว
เลือก Source Table แล้วกด F5 หรือ (คลิกขวา -> เลือก Copy Table to)
นี่จะแสดงรายการของตารางทั้งหมด (คุณสามารถค้นหาโดยใช้ชื่อตารางในหน้าต่างป๊อปอัป) เพียงเลือกเป้าหมายของคุณแล้วกดตกลง
DataGrip จะจัดการทุกอย่างให้คุณ
หากคุณเรียกใช้ pgAdmin (Backup:, pg_dump
Restore:) pg_restore
จาก Windows ระบบจะพยายามส่งออกไฟล์เป็นค่าเริ่มต้นc:\Windows\System32
และนั่นคือสาเหตุที่คุณจะได้รับการอนุญาต / ปฏิเสธการเข้าถึงข้อผิดพลาดและไม่ใช่เพราะผู้ใช้ postgres ยกระดับไม่เพียงพอ รันpgAdminในฐานะผู้ดูแลระบบหรือเพียงแค่เลือกตำแหน่งสำหรับเอาต์พุตอื่นที่ไม่ใช่โฟลเดอร์ระบบของ Windows
นอกจากนี้คุณยังสามารถแสดงตารางระยะไกลของคุณเป็นตารางท้องถิ่นโดยใช้ส่วนขยายของ wrapper ข้อมูลต่างประเทศ จากนั้นคุณสามารถแทรกลงในตารางของคุณโดยเลือกจากตารางในฐานข้อมูลระยะไกล ข้อเสียเพียงอย่างเดียวคือมันไม่เร็วมาก