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.