Den enkleste og hurtigste metode til at oprette en komplet kopi af en eksisterende (live) database er at bruge CREATE DATABASE
med en TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Der er dog en vigtig begrænsning overtræder dit andet krav:skabelondatabasen (kilde) kan ikke have yderligere forbindelser til den. Jeg citerer manualen:
Du kan afslutte alle sessioner til skabelondatabasen, hvis du har de nødvendige rettigheder med pg_terminate_backend()
.
For midlertidigt at afvise genforbindelser, tilbagekald CONNECT
privilegium
(og GRANT
tilbage senere).
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ør Postgres 9.2 bruger procpid
i stedet for pid
:
Relateret:
Hvis du ikke har råd til at afbryde samtidige sessioner, skal du fortsætte med at pibe output fra pg_dump
til psql
som er blevet foreslået af andre svar allerede.