PostgreSQL 上的僅文件系統備份有任何問題嗎?
我在亞馬遜雲中執行我的數據庫伺服器,並且我將數據庫文件放在單獨的 EBS 卷上。在備份/恢復操作方面,我發現只進行文件系統級備份而不是 sql 轉儲要簡單得多,因為我幾乎可以立即創建備份並從中恢復。
如果我堅持僅使用文件系統級備份,是否有可能會忽略的問題?
在 Ubuntu 12.04 上執行 PostgreSQL 9.1(今年晚些時候更新到 9.3)
如果我堅持僅使用文件系統級備份,是否有可能會忽略的問題?
是的——但不是你想的那些。只要您執行安全的文件系統級別的版權保護,風險就是依賴物理備份。
在寫這篇文章時,我注意到關於文件系統級備份的章節需要更新以將使用者指向
pg_basebackup
和pg_start_backup()
. 雖然技術上是流複製和 PITR 的一部分,但這些工具只是製作安全、一致的文件系統級別副本的方法,應該在文件的該部分中引用。安全地進行
根據PostgreSQL 文件系統級備份和基本備份的文件,只要您遵循其中給出的規則,獲取文件系統級副本是非常安全的,即執行以下操作之一:
- 在備份之前停止伺服器並使其關閉直到備份完成;
- 使用
pg_basebackup
;- 使用
pg_start_backup()
和pg_stop_backup()
複製生成的文件pg_stop_backup()
;或者- 使用原子文件系統快照並從快照複製,在這種情況下,由於它是快照,因此無法寫入任何內容。
您也可以使用
pg_basebackup -X stream
,這是我的偏好。它使用複制協議進行文件系統級別的複制,pg_start_backup()
為您處理等。物理備份的主要優點是可用作時間點恢復的基礎。
快照案例是安全的,因為它就像崩潰一樣。沒有寫入,數據庫狀態是在特定時刻擷取的。預寫日誌包含所有送出的事務數據,因此當數據庫首次啟動時,在恢復期間任何尚未刷新到堆的內容都會從 WAL 重放。這就像在崩潰後啟動一樣。
pg_start_backup()
如果您正在複製一個在複製時仍在寫入的實時數據庫目錄,您只需要和朋友;快照可以避免這種情況。請注意,僅當快照實際上是原子的時,依賴快照才是安全的,即它在單個瞬間擷取文件系統狀態。只有在涉及一個卷/文件系統時它也是安全的——你不能使用兩個獨立文件系統的兩個快照來進行備份,它們不會來自同一時刻。如果您正在使用表空間,那麼快照備份由於這個原因是不安全的 - 但是
pg_basebackup
orpg_start_backup()
,rsyncpg_stop_backup()
仍然是安全的。這意味著如果您的數據庫文件系統是(例如)
md
RAID 陣列中的四個 EBS 卷,或者您有一個用於pg_xlog
數據庫的其餘部分,一個用於其他數據庫,則您不能使用 EBS 快照進行一致的備份。如果一切都是一個 EBS 卷,那麼 EBS 快照是安全的。您還可以在執行備份之前停止 PostgreSQL,然後再啟動它。如果您是能夠負擔得起備用停機時間視窗的幸運者之一,那很好。無論如何,我個人更喜歡熱備份。
風險
要關心的真正問題是,當您進行物理備份時,您正在複製未經檢查和未經驗證的數據庫結構。如果存在未檢測到的損壞,您的備份可能沒有您想像的那麼有用。我個人也會使用邏輯轉儲。
一個有用的折衷辦法是在製作完副本後啟動文件系統級備份,然後
pg_dump
從文件系統級備份進行。這確保了它的可讀性,並為您提供了一個合乎邏輯的副本。如果您的邏輯轉儲失敗,您的自動化應該會向您發送電子郵件並尋求幫助,因為它表明您的物理副本也可能已損壞。順便說一句,我不久前在我的舊部落格上寫了很多關於避免數據失去/損壞問題的文章 - 請參閱避免 PostgreSQL 數據庫損壞。