sql >> Database >  >> RDS >> PostgreSQL

Hoe een testdatabase klonen van een productie-één in één enkele actie?

De eenvoudigste en snelste methode om een ​​volledige kopie van een bestaande (live) database te maken, is door CREATE DATABASE met een TEMPLATE :

CREATE DATABASE mydb_test TEMPLATE mydb;

Er is echter een belangrijke beperking in strijd met uw tweede vereiste:de sjabloon (bron) database kan er geen extra verbindingen mee hebben. Ik citeer de handleiding:

U kunt alle sessies naar de sjabloondatabase beëindigen als u over de benodigde rechten beschikt met pg_terminate_backend() .
Om tijdelijk geen nieuwe verbindingen toe te staan, herroep de CONNECT voorrecht (en GRANT later terug).

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 versies voor Postgres 9.2 gebruikt procpid in plaats van pid :

Gerelateerd:

Als je het je niet kunt veroorloven om gelijktijdige sessies te beëindigen, gebruik dan de uitvoer van pg_dump naar psql zoals is al gesuggereerd door andere antwoorden.



  1. ORA-12516, TNS:luisteraar kon geen beschikbare handler vinden

  2. Wat is het gemiddelde salaris van een SQL-ontwikkelaar?

  3. Crystal Reports kon geen gegevens ophalen uit de database

  4. PG::UndefinedTable:ERROR:relatie bestaat niet met een juiste Rails-naamgeving en -conventie