sql >> Databáze >  >> RDS >> PostgreSQL

Jak naklonovat testovací databázi z produkční v jedné jediné akci?

Nejjednodušší a nejrychlejší metodou k vytvoření úplné kopie existující (živé) databáze je použití CREATE DATABASE pomocí TEMPLATE :

CREATE DATABASE mydb_test TEMPLATE mydb;

Existuje však důležité omezení porušuje váš druhý požadavek:šablonová (zdrojová) databáze k ní nemůže mít další připojení. Cituji manuál:

Všechny relace k databázi šablon můžete ukončit, pokud máte potřebná oprávnění pomocí pg_terminate_backend() .
Chcete-li dočasně zakázat opětovné připojení, zrušit CONNECT privilegium (a GRANT zpět později).

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

Ve verzích před Postgres 9.2 používá procpid místo pid :

Související:

Pokud si nemůžete dovolit ukončit souběžné relace, použijte výstup pg_dump na psql like již navrhly jiné odpovědi.



  1. Co je ekvivalent LEN() v MySQL?

  2. Smyčka SQL Server – jak mohu procházet sadou záznamů

  3. Zadávání proměnlivého množství dat do databáze s nejlepší možnou normalizací

  4. kopírování do dočasné tabulky trvá dlouho