Nejjednodušší a nejrychlejší metodou k vytvoření úplné kopie existující (živé) databáze je použití CREATE DATABASE
pomocí TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Existuje však důležité omezení porušuje váš druhý požadavek:šablonová (zdrojová) databáze k ní nemůže mít další připojení. Cituji manuál:
Všechny relace k databázi šablon můžete ukončit, pokud máte potřebná oprávnění pomocí pg_terminate_backend()
.
Chcete-li dočasně zakázat opětovné připojení, zrušit CONNECT
privilegium
(a GRANT
zpět později).
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
Ve verzích před Postgres 9.2 používá procpid
místo pid
:
Související:
Pokud si nemůžete dovolit ukončit souběžné relace, použijte výstup pg_dump
na psql
like již navrhly jiné odpovědi.