既存の(ライブ)データベースの完全なコピーを作成する最も簡単で最速の方法は、 CREATE DATABASE
TEMPLATE
を使用
:
CREATE DATABASE mydb_test TEMPLATE mydb;
ただし、重要な制限があります 2番目の要件に違反しています。テンプレート(ソース)データベースに追加の接続を設定することはできません。 マニュアルを引用します:
pg_terminate_backend()
。
再接続を一時的に禁止するには、 CONNECT
を取り消します 特権
(およびGRANT
後で戻る)。
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
以前のバージョン Postgres9.2はprocpid
を使用します pid
の代わりに :
関連:
並行セッションを終了する余裕がない場合は、pg_dump
の出力をパイプ処理してください。 psql
へ のようなものはすでに他の回答によって提案されています。