Il metodo più semplice e veloce per creare una copia completa di un database esistente (live) consiste nell'usare CREATE DATABASE
con un TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Tuttavia, esiste un limite importante violando il tuo secondo requisito:il database del modello (origine) non può avere connessioni aggiuntive ad esso. Cito il manuale:
Puoi terminare tutte le sessioni nel database del modello se disponi dei privilegi necessari con pg_terminate_backend()
.
Per impedire temporaneamente le riconnessioni, revocare il CONNECT
privilegio
(e GRANT
più tardi).
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
Nelle versioni prima Postgres 9.2 usa procpid
invece di pid
:
Correlati:
Se non puoi permetterti di terminare sessioni simultanee, vai con il piping dell'output di pg_dump
a psql
come è già stato suggerito da altre risposte.