El método más simple y rápido para crear una copia completa de una base de datos (en vivo) existente es usar CREATE DATABASE
con una TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Sin embargo, existe una limitación importante violando su segundo requisito:la base de datos de la plantilla (fuente) no puede tener conexiones adicionales. Cito el manual:
Puede finalizar todas las sesiones en la base de datos de plantilla si tiene los privilegios necesarios con pg_terminate_backend()
.
Para deshabilitar temporalmente las reconexiones, revocar el CONNECT
privilegio
(y GRANT
volver más tarde).
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
En versiones anteriores Postgres 9.2 usa procpid
en lugar de pid
:
Relacionado:
Si no puede darse el lujo de terminar sesiones concurrentes, vaya canalizando la salida de pg_dump
a psql
como ya ha sido sugerido por otras respuestas.