Phương pháp đơn giản và nhanh nhất để tạo bản sao hoàn chỉnh của cơ sở dữ liệu hiện có (trực tiếp) là sử dụng CREATE DATABASE
với TEMPLATE
:
CREATE DATABASE mydb_test TEMPLATE mydb;
Tuy nhiên, có một hạn chế quan trọng vi phạm yêu cầu thứ hai của bạn:cơ sở dữ liệu mẫu (nguồn) không thể có kết nối bổ sung với nó. Tôi trích dẫn sách hướng dẫn:
Bạn có thể kết thúc tất cả các phiên đối với cơ sở dữ liệu mẫu nếu bạn có các đặc quyền cần thiết với pg_terminate_backend()
.
Để tạm thời không cho phép kết nối lại, thu hồi CONNECT
đặc quyền
(và GRANT
quay lại sau).
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
Trong các phiên bản trước Postgres 9.2 sử dụng procpid
thay vì pid
:
Có liên quan:
Nếu bạn không đủ khả năng để kết thúc các phiên đồng thời, hãy chuyển đầu ra của pg_dump
thành psql
như đã được gợi ý bởi các câu trả lời khác.