2014-09-04 68 views
2

我們每晚對我們的數據庫進行完整備份,然後使用該轉儲創建我自己的開發數據庫。 dev-db的創建時間大約需要10分鐘,所以每天早晨在我上班前通過cron安排。所以我現在可以使用幾乎 live db。如何恢復/倒帶我的PostgreSQL數據庫

但是,當我測試的東西有時會方便回滾完全數據庫或只是一些特定的表到初始備份。當然,我可以完全重新開發dev-db,但這會讓我再等10分鐘才能再次運行測試。

那麼有沒有一種簡單的方法來恢復/回捲數據庫/表到特定時間點或從轉儲?

我曾嘗試使用pg_restore這樣恢復特定的表:

pg_restore -d my-dev-db -n stuff -t tableA -t tableB latest-live-db.dump 

我也象-c--data-only也選擇嘗試。但似乎有幾個問題在這裏,我沒有預見到:

  • 舊的數據時,恢復的數據複製不會自動刪除。
  • 有幾個外鍵約束使得這不可能(糾正我,如果我錯了)沒有明確地刪除FK之前恢復,然後再次添加回來。
  • 在這一點上,失序的PK序列根本不關心我,但這可能也是一個問題。

編輯:我測試了更多的東西/看着:

  • pg_basebackup
  • 更強力的替代pg_basebackup是停止數據庫服務器,複製DB-文件,然後啓動數據庫服務器。

上述兩種替代方法都失敗了,因爲我有幾個本地數據庫在同一個集羣中運行,並且總計大量磁盤上的數據。這種方式無法分離數據庫!所以這裏的文件複製操作不會給我任何速度增益。

+0

也不能有這幫助你嗎? http://stackoverflow.com/questions/876522/creating-a-copy-of-a-database-in-postgres它詢問有關pgAdmin,但由於該命令是常規的SQL,它應該是足夠的。使用您的開發數據庫作爲模板,並在每次需要時從其創建一個新的數據庫。 – DrColossos 2014-09-04 09:26:54

+0

PITR和WAL歸檔? – 2014-09-04 09:31:38

回答

1

我假設你問的數據庫不是集羣。我想到的第一件事是將備份恢復到2個不同的dbs,一個名稱爲dev_db,另一個名稱爲dev_db_back。然後,當你需要一個新的DB下降dev_db和重命名dev_db_backupdev_db

drop database if exists dev_db; 
alter database dev_db_backup rename to dev_db; 

之後,有其他來源的重命名,備份再次恢復到dev_db_backup。這可以通過腳本來完成,因此丟棄,重命名和恢復將會自動完成。由於刪除和重命名是即時啓動腳本,重命名完成,無需等待新的恢復。

如果是共同的需要在更短的間隔10分鐘,我認爲你可以嘗試做你正在一個事務中做重複的恢復:

begin; 
-- alter the db 
-- test the alterations 
commit; -- or ... 
-- rollback; 
+0

這是一個很好的建議,讓我更接近我想要的地方。仍然有限制,我只有一個熱備份使用,然後它的10分鐘再次等待得到一個新的備份。我可能會使用這樣的東西! – UlfR 2014-09-04 09:05:23

+0

@UlfR看起來你需要交易。更新 – 2014-09-04 09:12:13