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

Hvordan kloner man en testdatabase fra en produktion i én enkelt handling?

Den enkleste og hurtigste metode til at oprette en komplet kopi af en eksisterende (live) database er at bruge CREATE DATABASE med en TEMPLATE :

CREATE DATABASE mydb_test TEMPLATE mydb;

Der er dog en vigtig begrænsning overtræder dit andet krav:skabelondatabasen (kilde) kan ikke have yderligere forbindelser til den. Jeg citerer manualen:

Du kan afslutte alle sessioner til skabelondatabasen, hvis du har de nødvendige rettigheder med pg_terminate_backend() .
For midlertidigt at afvise genforbindelser, tilbagekald CONNECT privilegium (og GRANT tilbage senere).

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

I versioner før Postgres 9.2 bruger procpid i stedet for pid :

Relateret:

Hvis du ikke har råd til at afbryde samtidige sessioner, skal du fortsætte med at pibe output fra pg_dump til psql som er blevet foreslået af andre svar allerede.



  1. SQLite ER NULL

  2. Serienumre pr. gruppe af rækker for sammensat nøgle

  3. Mange-til-mange-relation i Entity Framework med relationsinformation

  4. Lukning af postgres (pg) klientforbindelse i node.js