O método mais simples e rápido para criar uma cópia completa de um banco de dados existente (ao vivo) é usar
CREATE DATABASE
com um TEMPLATE
:CREATE DATABASE mydb_test TEMPLATE mydb;
No entanto, há uma limitação importante violando seu segundo requisito:o banco de dados modelo (fonte) não pode ter conexões adicionais com ele. Cito o manual:
Você pode encerrar todas as sessões no banco de dados de modelo se tiver os privilégios necessários com
pg_terminate_backend()
.Para desabilitar temporariamente as reconexões, revogar o
CONNECT
privilégio
(e GRANT
volte depois). 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
Nas versões antes Postgres 9.2 usa
procpid
em vez de pid
:Relacionado:
Se você não puder encerrar sessões simultâneas, use o canal de saída de
pg_dump
para psql
como já foi sugerido por outras respostas.