PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come clonare un database di test da uno di produzione in una singola azione?

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.