22.2. 文件系統級別的備份

另一個備份的策略是直接拷貝PostgreSQL用於存放資料庫資料的文件。 我們在 Section 16.2 裡解釋了這些文件的位置, 不過如果您想用這個方法,您早就找到它們的位置。 您可以用自己喜歡的任何常用文件系統備份的方法,例如

tar -cf backup.tar /usr/local/pgsql/data

不過,您要受到兩個限制,令這個方法不那麼實用,或者至少比 pg_dump 的方法遜色一些:

  1. 為了進行有效的備份,資料庫伺服器必須被關閉。 象拒絕所有連線這樣的折衷的方法是不行的,因為總是有一些緩衝區資料存在。 (主要因為 tar 和類似的工具在做備份的時候並不對文件系統的狀態做原子快照)。 有關關閉伺服器的訊息可以在 Section 16.6裡面找到。 不用說,您在恢復資料之前,必須關閉伺服器。

  2. 如果您曾經深入瞭解了資料庫在文件系統佈局的細節,您可能試圖從對應的文件或目錄裡備份幾個資料表或者資料庫。 這樣做是沒用的,因為包含在這些文件裡的訊息只是部分訊息。還有一半訊息在提交日誌文件 pg_clog/*裡面,它包含所有交易的提交狀態。 只有擁有這些訊息,資料表文件的訊息才是可用的。當然,試圖只恢復資料表和相關的 pg_clog 資料也是徒勞的,因為這樣會把資料庫集群裡的所有其他沒有用的資料表的訊息都拿出來。 所以文件系統的備份只適用於一個資料庫集群的完整恢復。

另外一個文件系統備份的方法是給資料目錄做一個"一致的快照", 條件是文件系統支援這個功能(並且您願意相信它是實現正確的)。 典型的過程是製作一個包含資料庫的卷的"凍結快照", 然後把整個資料庫目錄(不僅僅是部分,見上文)從快照拷貝到備份設備, 然後釋放凍結快照。這樣甚至在資料庫伺服器在執行的時候都可以運轉。 不過,這樣建立的備份會把資料庫文件保存在一個沒有恰當關閉資料庫伺服器的狀態下; 因此,如果您在這個備份目錄下啟動資料庫伺服器, 它就會認為資料庫伺服器經歷過崩潰並且重放 WAL 日誌。這不是個問題,只要意識到它即可(並且確信在自己的備份中包含 WAL 文件)。

如果您的資料庫分佈在多個捲上(比如,資料文件和 WAL 日誌在不同的磁盤上),那麼可能就沒有任何方法獲取所有捲上準確的同步凍結快照。 在您新聞這樣的情況下的一致性快照的技術之前,仔細閱讀您的文件系統文件。 最安全的方法是關閉資料庫伺服器足夠長的時間,以建立所有凍結快照。

還要說明的是,文件系統備份不會比SQL轉儲小。恰恰相反,大多數情況下它要大。 (比如pg_dump 不用倒出索引,只是建立它們的命令。)