PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como clonar um banco de dados de teste de um de produção em uma única ação?


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.