2011-06-28 31 views
6

Tôi có một yêu cầu trong đó tôi cần chụp nhanh một cơ sở dữ liệu và khôi phục nó trong cùng một máy với một số tên được xác định trước khác trong postgres. Tôi đã cố gắng thực hiện tác vụ trên bằng lệnh sau.Sao chép cơ sở dữ liệu trong postgres

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

Nhưng tùy chọn này không thành công khi kết nối/phiên nguồn sourceDb tồn tại. Tôi cần phải cắt bớt tùy chọn này vì có khả năng người dùng thực hiện thao tác đọc cao. Tất cả các tùy chọn dòng lệnh như restore_db, backup_db doest phù hợp với request.Hence của tôi, tôi cần một số lệnh console/chức năng/thủ tục lưu trữ để đạt được nó, tôi cần kết nối tới cơ sở dữ liệu và gọi một số thủ tục lệnh/chức năng/cửa hàng. mục tiêu.

Có ai trong số các bạn đề xuất một số loại giải pháp theo yêu cầu của tôi không?

Trả lời

11

Tại sao bạn không chỉ tạo ra một bãi chứa cơ sở dữ liệu hiện có sourceDb sử dụng lệnh

pg_dump sourceDb > destinationDb.sql 

Và trong này bãi SQL destinationDb.sql, thay đổi tên db đến cái mới trong dòng CREATE DATABASE. Sau đó, bạn có thể tạo DB mới này trên máy chủ sử dụng psql như:

psql destinationDb < destinationDb.sql 
+0

Tôi đã thử tùy chọn này nhưng không phù hợp với yêu cầu của chúng tôi. – Patton

+0

tại sao? u có thể xây dựng trên trường hợp đặc biệt này không? – nemesisfixx

+0

thực sự chúng tôi không muốn sử dụng bất kỳ tùy chọn dòng lệnh postgres nào như createb, dropdb inthis case pg_dump; và tùy chọn chúng tôi đang tìm kiếm là một số điều khác nhau, nói theo chương trình (sử dụng JDBC). Tùy chọn tôi đã đề cập TẠO DATABASE destniationDb TEMPLATE sourceDb; mất ít hơn 6 giây để hoàn thành thao tác. Trong trường hợp bạn đã đề cập, phải mất một phút để hoàn thành thao tác BTW Tôi đã thử giải pháp được cung cấp tại đây http://stackoverflow.com/questions/1237725/how-to- copy-postgres-database-to-another-server khác – Patton

0

Bạn đã thử locking the table đầu tiên?

EDIT: Tôi có thể đã quá đơn giản. Tôi đã suy nghĩ nếu bạn khóa ghi vào các bảng bạn đang sao chép các hoạt động có thể làm việc. Nhưng có vẻ như đó không phải là trường hợp khi nhân bản toàn bộ db.

Đi từ liên kết bạn đã cung cấp trong nhận xét của bạn, cơ sở dữ liệu phải không có hoạt động phiên. Tôi giải quyết điều này bằng cách đơn giản khởi động lại dịch vụ bưu chính ngay trước khi hoạt động. Nếu tập lệnh đủ nhanh, bản sao tiếp theo của bạn sẽ chạy trước khi phiên mới có thể kết nối. Tôi tin rằng postgres sẽ đợi đến 90 giây cho các phiên kết thúc để giải pháp này không nên quá gây rối.

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html Vui lòng trải qua điều này.Đó rõ ràng là khi một phiên cho nguồn Db đang mở thì thao tác thất bại. BTW Tôi đã không thử này khóa bảng bạn có thể xin vui lòng cho tôi một ví dụ về cách làm điều đó trong kịch bản hiện tại? – Patton

+0

@Spiff Giải pháp của bạn có vẻ tốt sẽ kiểm tra xem điều này có khả thi không. – Patton

Các vấn đề liên quan