PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment cloner une base de test à partir d'une base de production en une seule action ?

La méthode la plus simple et la plus rapide pour créer une copie complète d'une base de données existante (active) consiste à utiliser CREATE DATABASE avec un TEMPLATE :

CREATE DATABASE mydb_test TEMPLATE mydb;

Cependant, il existe une limitation importante enfreignant votre deuxième exigence :la base de données modèle (source) ne peut pas avoir de connexions supplémentaires avec elle. Je cite le manuel :

Vous pouvez mettre fin à toutes les sessions sur la base de données de modèles si vous disposez des privilèges nécessaires avec pg_terminate_backend() .
Pour interdire temporairement les reconnexions, révoquer le CONNECT privilège (et GRANT revenir plus tard).

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

Dans les versions avant Postgres 9.2 utilise procpid au lieu de pid :

Connexe :

Si vous ne pouvez pas vous permettre de mettre fin à des sessions simultanées, dirigez-vous vers la sortie de pg_dump vers psql comme cela a déjà été suggéré par d'autres réponses.