De eenvoudigste en snelste methode om een volledige kopie van een bestaande (live) database te maken, is door CREATE DATABASE
met een TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Er is echter een belangrijke beperking in strijd met uw tweede vereiste:de sjabloon (bron) database kan er geen extra verbindingen mee hebben. Ik citeer de handleiding:
U kunt alle sessies naar de sjabloondatabase beëindigen als u over de benodigde rechten beschikt met pg_terminate_backend()
.
Om tijdelijk geen nieuwe verbindingen toe te staan, herroep de CONNECT
voorrecht
(en GRANT
later terug).
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
In versies voor Postgres 9.2 gebruikt procpid
in plaats van pid
:
Gerelateerd:
Als je het je niet kunt veroorloven om gelijktijdige sessies te beëindigen, gebruik dan de uitvoer van pg_dump
naar psql
zoals is al gesuggereerd door andere antwoorden.