Най-простият и бърз метод за създаване на пълно копие на съществуваща (активна) база данни е да използвате CREATE DATABASE
с TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Има обаче едно важно ограничение нарушавайки второто ви изискване:шаблонът (изходната) база данни не може да има допълнителни връзки към нея. Цитирам ръководството:
Можете да прекратите всички сесии към шаблонната база данни, ако имате необходимите привилегии с pg_terminate_backend()
.
За да забраните временно повторно свързване, отмени CONNECT
привилегия
(и GRANT
обратно по-късно).
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
Във версии преди Postgres 9.2 използва procpid
вместо pid
:
Свързани:
Ако не можете да си позволите да прекратите едновременни сесии, отидете с прехвърляне на изхода на pg_dump
към psql
като вече е предложено от други отговори.