Den enklaste och snabbaste metoden för att skapa en komplett kopia av en befintlig (live) databas är att använda CREATE DATABASE
med en TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Det finns dock en viktig begränsning bryter mot ditt andra krav:mallen (källdatabasen) kan inte ha ytterligare anslutningar till den. Jag citerar manualen:
Du kan avsluta alla sessioner till malldatabasen om du har nödvändiga privilegier med pg_terminate_backend()
.
För att tillfälligt stänga av återanslutningar, återkalla CONNECT
privilegium
(och GRANT
tillbaka senare).
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
I versioner före Postgres 9.2 använder procpid
istället för pid
:
Relaterat:
Om du inte har råd att avsluta samtidiga sessioner, gå med piping av utdata från pg_dump
till psql
liknande har redan föreslagits av andra svar.