Bagaimana cara menduplikasi database di postgresql?

17

Saya perlu menduplikasi database yang ada termasuk skema dan strukturnya ke database baru lainnya. Saya membutuhkan ini di lingkungan perintah shell dan bukan di pgadmin. Tolong bantu saya.

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

pengguna saya adalah "postgres"

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

Jawaban:

33

Jika Anda ingin menduplikatnya di dalam instalasi PostgreSQL yang sama dan Anda tidak memiliki pengguna yang terhubung secara aktif, ada pintasan praktis:

CREATE DATABASE my_new_database TEMPLATE my_old_database;

atau dari shell

createdb -T my_old_database my_new_database;

Kalau tidak, Anda harus menggunakan pg_dump, createdbdan pg_restore, misalnya

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

Jika Anda menggunakan nohupsehingga perintah tidak mati jika Anda kehilangan sesi ssh Anda, pertimbangkan untuk menggunakan screen.

Craig Ringer
sumber
1
Luar biasaCREATE DATABASE my_new_database TEMPLATE my_old_database;
anjaneyulubatta505
1
Cemerlang! Bukan hanya menyalin struktur, tetapi juga data!
Foton
@ Foton Yap, meskipun Anda dapat menggunakan pg_dumpdan pg_restorejika Anda ingin lebih selektif dan membuang (katakanlah) hanya struktur.
Craig Ringer
0

Postgres memungkinkan penggunaan basis data apa pun yang ada di server sebagai templat saat membuat basis data baru. Saya tidak yakin apakah pgAdmin memberi Anda opsi pada dialog buat database tetapi Anda harus bisa menjalankan yang berikut di jendela kueri jika tidak:

CREATE DATABASE newdb WITH TEMPLATE originaldb OWNER dbuser;

Namun, Anda mungkin mendapatkan:

GALAT: sumber database "originaldb" sedang diakses oleh pengguna lain

Untuk memutuskan sambungan semua pengguna lain dari basis data, Anda dapat menggunakan kueri ini:

SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'originaldb' AND pid <> pg_backend_pid();
pengguna200679
sumber