22.2. 文件系統級別的備份

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

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

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

  1. 為了進行有效的備份,數據庫服務器必須被關閉。 象拒絕所有聯接這樣的折衷的方法是不行的,因為總是有一些緩衝區數據存在。 同樣的原因,我們也不建議信任那些聲稱支持 "連續快照(consistent snapshots)"的操作系統。 有關關閉服務器的信息可以在 Section 16.6裡面找到。

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

另外一個文件系統備份的方法是給數據目錄做一個"一致的快照", 條件是文件系統支持這個功能。這樣的快照會把數據庫文件保存在一個沒有恰當關閉數據庫服務器的狀態下; 因此,如果你在這個備份目錄瞎啟動數據庫服務器,它就會認為數據庫服務器經歷過崩潰並且重放 WAL 日志。 這不是個問題,只要意識到它即可。

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