PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie klont man eine Testdatenbank aus einer Produktionsdatenbank in einer einzigen Aktion?

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.