Najprostszą i najszybszą metodą utworzenia pełnej kopii istniejącej (aktywnej) bazy danych jest użycie CREATE DATABASE z TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Istnieje jednak ważne ograniczenie naruszenie drugiego wymagania:baza danych szablonu (źródłowa) nie może mieć do niej dodatkowych połączeń. Cytuję instrukcję:
Możesz zakończyć wszystkie sesje z bazą danych szablonów, jeśli masz niezbędne uprawnienia za pomocą pg_terminate_backend()
.
Aby tymczasowo uniemożliwić ponowne połączenia, odwołaj CONNECT przywilej
(i GRANT z powrotem później).
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
W wersjach przed Postgres 9.2 używa procpid zamiast pid :
Powiązane:
Jeśli nie możesz sobie pozwolić na zakończenie jednoczesnych sesji, przejdź do potoku wyjścia pg_dump do psql jak zostało już sugerowane przez inne odpowiedzi.