Windows Server 2008 R2 上的 Postgresql 9.0.8 實體備份會導致“存取被拒絕”

Windows Server 2008 R2 上的 Postgresql 9.0.8 實體備份會導致“存取被拒絕”

我按照 PostgreSQL 9 Administration Cookbook (Riggs/Krosing) 中的「獨立熱物理資料庫備份」配方建立了一個腳本來執行 Postgresql 9.0.8 資料庫的實體備份,但我針對 Windows Server 2008 R2 對其進行了調整。

對於使用 rsync 複製所有資料檔案(不包括 pg_xlog 目錄)的配方步驟#4,我使用 robocopy.exe (因為 rsync 是一個 *nix 實用程序,而我使用的是 Windows)。問題是,通常無法複製其中一個文件並導致“訪問被拒絕”。手動複製文件失敗並顯示“訪問被拒絕”長的備份腳本失敗後 - 所以這不是可以重試的間歇性問題。只有重新啟動 PostgreSQL 程序後才能複製該檔案。它總是一個不同的文件。昨晚是 %PGDATADIR%\5432\base\24609\38122 。

我想聽聽您是否經歷過這種情況以及您採取了哪些措施來解決此問題。我正在考慮:

  1. 在備份之前重新啟動 PostgreSQL 伺服器(我承認這是一個 hack)
  2. 使用某種可以複製開啟檔案的實用程序,例如 VSHADOW、DISKSHADOW 和 hobocopy(注意:不是 robocopy)
  3. 也許有某種方法可以指示 PostgreSQL 釋放所有鎖定?
  4. [添加]見下文 - 看起來添加定期“真空”可以消除症狀

答案1

好吧,首先要做的就是──收起你的食譜。相反去閱讀Postgres 手冊中有關備份的部分。閱讀整章——它並不長。
(您可能會注意到這本書與本書之間的一些相似之處 - 大多數 Postgres 書籍只是手冊的美化版本 - 但您應該始終將手冊作為您的主要參考。)。

下面我將使用的所有術語都來自手冊(因此,如果您認為可以跳過閱讀作業,那麼您就不能 - 如果您這樣做,您可能會感到非常困惑)。


現在針對您的實際問題 - Unix 解決方案通常無法直接移植到 Windows,這是其中一種情況:*nix 系統會很樂意抓取正在操作的檔案 - Windows 會拋出您所看到的錯誤。

如何處理這個問題取決於您正在執行哪種備份。

檔案系統級備份

如果你正在做一個“檔案系統級備份”必須關閉伺服器。句號,討論結束,沒有其他選擇。必須完全關閉資料庫才能使該類型的備份可靠(如果您獲得的備份不可靠,那還有什麼意義呢?)。

連續歸檔/時間點恢復和從屬伺服器

如果你正在做一個基礎備份作為設定的一部分時間點恢復& 日誌傳送您有兩個選擇:

  • 無論如何關閉伺服器。
  • 使用可以複製開啟檔案的工具(問題中的選項(2))

然後,您會依照時間點復原/日誌傳送文件的其餘部分繼續操作,建立從屬伺服器。
當您想要將資料庫伺服器複製到磁碟時,只需停止從屬伺服器,備份它,然後重新啟動它 - 世界會不斷打開您的主伺服器,從屬伺服器將在重新啟動時趕上它錯過的內容。

您也可以使用基本備份加上滾動交易日誌(通常將其作為良好可靠的資料庫備份傳送到從屬伺服器)。這似乎是最接近您在問題中想要實現的目標,但我會推薦我描述的從屬備份 - 更多好處(您有熱備用)和主伺服器更少的工作(沒有)額外的檢查點來滾動備份的交易日誌)。

其他的東西

如果以上都不吸引您,那麼您幾乎只能使用SQL 轉儲
也有缺點:Postgres 必須在轉儲時鎖定每個表(這意味著對資料庫的寫入將被阻止),並且 SQL 轉儲比其他選項慢。
如果您的資料庫有任何實際大小,我不會建議使用此方法。

相關內容