PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để sao chép một cơ sở dữ liệu thử nghiệm từ một cơ sở dữ liệu sản xuất trong một hành động duy nhất?

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào bạn có thể mở rộng một hàng PostgreSQL cô đọng thành các cột riêng biệt?

  2. Điều gì đã xảy ra với NpgsqlCopySerialize và NpgsqlCopyIn

  3. Hết thời gian chờ kết nối PostgreSQL

  4. Trả lại một truy vấn từ một hàm?

  5. Rails:Không có nhóm kết nối cho ActiveRecord ::Base