Die einfachste und schnellste Methode zum Erstellen einer vollständigen Kopie einer vorhandenen (Live-)Datenbank ist die Verwendung von CREATE DATABASE
mit einem TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Es gibt jedoch eine wichtige Einschränkung Verletzung Ihrer zweiten Anforderung:Die Vorlagendatenbank (Quelldatenbank) darf keine zusätzlichen Verbindungen zu ihr haben. Ich zitiere das Handbuch:
Sie können mit pg_terminate_backend()
.
Um Wiederverbindungen vorübergehend zu verbieten, den CONNECT
widerrufen Privileg
(und GRANT
zurück später).
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 Versionen vorher Postgres 9.2 verwendet procpid
statt pid
:
Verwandte:
Wenn Sie es sich nicht leisten können, gleichzeitige Sitzungen zu beenden, leiten Sie die Ausgabe von pg_dump
weiter zu psql
like wurde bereits von anderen Antworten vorgeschlagen.