sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur klonas en testdatabas från en produktionsdatabas i en enda åtgärd?

Den enklaste och snabbaste metoden för att skapa en komplett kopia av en befintlig (live) databas är att använda CREATE DATABASE med en TEMPLATE :

CREATE DATABASE mydb_test TEMPLATE mydb;

Det finns dock en viktig begränsning bryter mot ditt andra krav:mallen (källdatabasen) kan inte ha ytterligare anslutningar till den. Jag citerar manualen:

Du kan avsluta alla sessioner till malldatabasen om du har nödvändiga privilegier med pg_terminate_backend() .
För att tillfälligt stänga av återanslutningar, återkalla CONNECT privilegium (och GRANT tillbaka senare).

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öre Postgres 9.2 använder procpid istället för pid :

Relaterat:

Om du inte har råd att avsluta samtidiga sessioner, gå med piping av utdata från pg_dump till psql liknande har redan föreslagits av andra svar.



  1. Rails 3, Heroku:Taps Server Error:PGError:ERROR:ogiltig bytesekvens för kodning av UTF8:0xba

  2. MySQL:Ökar GROUP_CONCAT_MAX_LEN param - några faror?

  3. Oracle SQL:Använder funktionen CHR() med || sammanfoga

  4. DateTimes representation i millisekunder?