2009-07-15 84 views
1

Hy guys,我有一個postgresql 8.3服務器與許多數據庫。Postgresql PITR備份:處理多個數據庫的最佳實踐?

事實上,即時通訊規劃備份與腳本的數據庫,將存儲所有的備份文件夾中與數據庫的名稱相同,例如:

/mypath/backup/my_database1/ 
/mypath/backup/my_database2/ 
/mypath/backup/foo_database/ 

我每天做1點轉儲各2小時,每天覆蓋的文件...例如,在my_database1文件夾中我有:

my_database1.backup-00.sql //backup made everyday at the 00.00 AM 
my_database1.backup-02.sql //backup made everyday at the 02.00 AM 
my_database1.backup-04.sql //backup made everyday at the 04.00 AM 
my_database1.backup-06.sql //backup made everyday at the 06.00 AM 
my_database1.backup-08.sql //backup made everyday at the 08.00 AM 
my_database1.backup-10.sql //backup made everyday at the 10.00 AM 
[...and so on...] 

這是我真正保證自己能夠恢復everydatabase失去至少2個小時的數據。

2小時仍然看起來太多。

我得看看到PostgreSQL PITR trought的WAL文件,但這些文件似乎包含所有數據約所有我的數據庫。

我需要分開這些文件,就像我分開轉儲文件一樣。

如何?

否則,還有另一種易於安裝的備份程序,允許我在10秒之前恢復1次備份,但不會每10秒創建一次轉儲文件?

回答

1

爲什麼要分開數據庫?

PITR的工作方式是不可能的,因爲它在整個集羣上工作。 在這種情況下你可以做的是爲每個數據庫創建一個數據目錄和一個單獨的羣集(不推薦,因爲它需要不同的端口和postmaster實例)。

我相信使用PITR而不是常規轉儲的好處勝過每個數據庫都有獨立的備份,因此您可能會重新考慮爲什麼需要將其分開的原因。

另一種方法是使用Slony-I設置一些複製,但這需要一個接收數據的單獨機器(或實例)。另一方面,這樣你就可以近乎實時地複製系統。

更新評論:

從錯誤中恢復,如刪除表,PITR將是完美的,因爲你可以重播的具體時間。但是,對於500個數據庫,我知道這可能會造成很大的開銷。 Slony-I可能無法工作,因爲它在複製。不知道它如何處理表刪除。

我不知道有任何其他方法可以去。我會做的事情可能仍然是PITR,只是沒有犯任何錯誤;)。言歸正傳,根據錯誤正在作出多麼頻繁,這可能是一個解決方案:

  • 將其設置爲PITR
  • 有第二個實例,準備待命。
  • 發生錯誤時,請將還原重放到第二個實例的時間點。
  • 從該實例中執行受影響的數據庫的pg_dump。
  • 在該數據庫的生產實例上執行pg_restore。

但是,它會要求你有第二個實例準備好,無論是在同一個服務器或一個不同(不同的建議)上。此外,還原時間會稍長一些,因爲它需要您執行一次額外的轉儲和還原。

+0

因爲每個數據庫都是獨立的。 如果我刪除database1中的表,並在10分鐘後我看到的錯誤,我想恢復只是database1,不是所有的人... pg_dump模式工作正常,但我不能讓pg_dump每10秒(我有大約500個數據庫...) – Strae 2009-07-15 15:31:28

2

PostgresSQL的一個實例是不可能的。

您可以將您的500臺幾個實例之間,不同端口上的每個聽,但這意味着他們將不能有效利用資源,如內存(內存保留但未使用的一個實例不能被其他使用)。

Slony在這裏也不會工作,因爲它不會複製DDL語句,比如刪除一個表。

我建議做兩個:

  • 繼續做你的pg_dump備份,但儘量使其平滑 - 油門pg_dump的IO帶寬,所以它不會削弱一個服務器,並持續運行它 - 當它完成最後一個數據庫,然後立即從第一個數據庫開始;

  • 另外設置PITR。

這種方式可以快速恢復單個數據庫,但可以丟失一些數據。如果您決定承受不起這麼多數據的損失,那麼您可以將PITR備份恢復到臨時位置(爲了提高速度,fsync = off和pg_xlog符號鏈接到ramdisk),pg_dump會從那裏影響數據庫並將其恢復到您的主數據庫數據庫。

+0

你能否更好地解釋你的第一點 - 節奏pg_dump io bandwith-?我還沒有完全理解它 – Strae 2009-07-16 06:10:25

+1

使用例如油門程序(http://klicman.org/throttle/ GPLv2許可證)。例如:「pg_dump dbname | throttle -M 3> dbname.sql」將pg_dump限制爲3MBps,這對數據庫性能沒有太大影響。明智地選擇你的限制 - 更小的限制 - 它需要更多的時間,更大的數據庫性能將受到更多的影響。 – Tometzky 2009-07-16 11:41:25

1

我認爲你這樣做的方式是有缺陷的。你應該有一個具有多個模式和角色的數據庫。然後你可以使用PITR。但是,PITR不能代替轉儲。