วิธีการทำซ้ำฐานข้อมูลใน postgresql


17

ฉันต้องการทำซ้ำฐานข้อมูลที่มีอยู่รวมถึงสคีมาและโครงสร้างไปยังฐานข้อมูลใหม่อื่น ฉันต้องการสิ่งนี้ในสภาพแวดล้อมคำสั่งเชลล์และไม่อยู่ใน pgadmin ได้โปรดช่วยฉันด้วย

nohup pg_dump exampledb > example-01.sql
createdb -O postgres exampledbclone_01

ผู้ใช้ของฉันคือ "postgres"

nohup psql exampledbclone_01 < example-01.sql
$ pg_dump mydb > db.sql
$ psql -d newdb -f db.sql

คำตอบ:


36

หากคุณต้องการทำซ้ำภายในการติดตั้ง PostgreSQL เดียวกันและคุณไม่ได้เชื่อมต่อผู้ใช้อย่างแข็งขันมีทางลัดที่สะดวก:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

หรือจากเปลือก

createdb -T my_old_database my_new_database;

มิฉะนั้นคุณจะต้องใช้pg_dump, createdbและpg_restoreเช่น

pg_dump -Fc -f olddb.pgdump -d olddb &&\
createdb newdb &&\
pg_restore -d newdb olddb.pgdump

หากคุณกำลังใช้nohupคำสั่งนั้นจะไม่ตายหากคุณทำเซสชั่น ssh หายให้ลองใช้screenแทน


1
ดีเลิศCREATE DATABASE my_new_database TEMPLATE my_old_database;
anjaneyulubatta505

1
ยอดเยี่ยม! ไม่เพียงแค่คัดลอกโครงสร้าง แต่ยังรวมถึงข้อมูล!
Foton

@Foton ใช่คุณสามารถใช้pg_dumpและpg_restoreถ้าคุณต้องการที่จะเลือกมากขึ้นและการถ่ายโอนข้อมูล (พูด) เพียงแค่โครงสร้าง
Craig Ringer

0

Postgres อนุญาตให้ใช้ฐานข้อมูลใด ๆ ที่มีอยู่บนเซิร์ฟเวอร์เป็นแม่แบบเมื่อสร้างฐานข้อมูลใหม่ ฉันไม่แน่ใจว่า pgAdmin ให้ตัวเลือกแก่คุณในกล่องโต้ตอบสร้างฐานข้อมูลหรือไม่ แต่คุณควรจะสามารถดำเนินการต่อไปนี้ในหน้าต่างแบบสอบถามได้หากไม่ได้:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

ถึงกระนั้นคุณอาจได้รับ:

ข้อผิดพลาด: ผู้ใช้รายอื่นกำลังเข้าถึงฐานข้อมูลต้นฉบับ "originaldb"

หากต้องการยกเลิกการเชื่อมต่อผู้ใช้รายอื่นทั้งหมดจากฐานข้อมูลคุณสามารถใช้แบบสอบถามนี้:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.