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.