sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo clonar una base de datos de prueba de una de producción en una sola acción?

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.