2011-06-28 58 views
6

我有一個要求,我需要拍攝一個數據庫的快照並在postgres中使用其他預定義名稱在同一臺機器中恢復它。 我試圖用以下命令來完成上述任務。在postgres中複製數據庫

CREATE DATABASE destniationDb TEMPLATE sourceDb; 

但是,當連接/會話到SOURCEDB exists.So我需要的,因爲是用戶在做讀操作的可能性高截斷此選項,該選項失敗。 所有命令行選項,如restore_db,backup_db都適合我的要求。因此,我需要一些控制檯命令/函數/存儲過程來實現它,即我需要連接到數據庫並調用某些實現此功能的命令/函數/存儲過程目的。

你們中的任何人都可以爲我的要求提供某種解決方案嗎?

回答

11

你爲什麼不只是使用命令

pg_dump sourceDb > destinationDb.sql 

而且在這個SQL轉儲destinationDb.sql,該數據庫名稱更改爲在CREATE DATABASE線的新創建現有數據庫sourceDb的轉儲。

psql destinationDb < destinationDb.sql 
+0

我試過這個選項,但它不適合我們的要求。 – Patton

+0

爲什麼?你能詳細說明這個特例嗎? – nemesisfixx

+0

實際上我們不想使用任何像createb,dropdb這樣的postgres命令行選項,在這種情況下pg_dump;我們正在尋找的選項有些不同,比如編程式(使用JDBC)。我提到的選項 CREATE DATABASE destniationDb TEMPLATE sourceDb; 需要不到6秒完成操作。在你提到的情況下,需要一分鐘才能完成操作 順便說一句我已經嘗試了這裏給出的解決方案http://stackoverflow.com/questions/1237725/how-to- copy-postgres-database-to-another-server – Patton

0

你試過locking the table第一:在這之後,你就可以使用psql像在服務器上創建這個新的數據庫?

編輯:我可能是過於簡單化了。我在想,如果將寫入操作鎖定到正在複製操作的表格可能會起作用。但是,克隆整個db似乎並非如此。

從您在評論中提供的鏈接開始,數據庫必須沒有活動的會話。我通過在操作之前立即重新啓動postgres服務來解決這個問題。如果腳本速度足夠快,您的後續副本應該在新會話連接之前運行。我相信postgres會等待長達90秒的會話結束,所以這個解決方案不應該太破壞性。

+0

http://www.postgresql.org/docs/9.0/static/manage-ag-templatedbs.html 請仔細閱讀本文。它清楚地表明,當一個會話源Db打開,則操作失敗。 順便說一句我沒有嘗試這個鎖定表可以請給我一個關於如何在目前的情況下做一個例子? – Patton

+0

@Spiff你的解決方案看起來很好,會檢查這是否可行。 – Patton