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.