Metode paling sederhana dan tercepat untuk membuat salinan lengkap dari database (langsung) yang ada adalah dengan menggunakan CREATE DATABASE
dengan TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Namun, ada batasan penting melanggar persyaratan kedua Anda:database template (sumber) tidak dapat memiliki koneksi tambahan ke sana. Saya mengutip manualnya:
Anda dapat menghentikan semua sesi ke database template jika Anda memiliki hak istimewa yang diperlukan dengan pg_terminate_backend()
.
Untuk sementara melarang koneksi ulang, cabut CONNECT
hak istimewa
(dan GRANT
kembali lagi nanti).
REVOKE CONNECT ON DATABASE mydb FROM PUBLIC;
-- while connected to another DB - like the default maintenance DB "postgres"
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydb' -- name of prospective template db
AND pid <> pg_backend_pid(); -- don't kill your own session
CREATE DATABASE mydb_test TEMPLATE mydb;
GRANT CONNECT ON DATABASE mydb TO PUBLIC; -- only if they had it before
Dalam versi sebelum Postgres 9.2 menggunakan procpid
bukannya pid
:
Terkait:
Jika Anda tidak mampu untuk menghentikan sesi bersamaan, gunakan output dari pg_dump
ke psql
suka telah disarankan oleh jawaban lain.