25.4. 內部

在版本 7.1 以後,WAL 是自動打開的。 除了要求一些額外的磁盤空間存放 WAL日志以及一些必要的調節以外(參閱Section 25.3), 對管理員沒有什麼其他要求,

WAL 日志存放在數據目錄的 pg_xlog 目錄裡,它是作為一個文件段的集合存儲的,每個段 16 MB 大。 每個段分割成 8 KB 的頁。日志記錄頭在 access/xlog.h 裡描述;日志內容取決于它記錄的事件的類型。 段文件的名字是遞增自然數,從 0000000000000000開始。目前這些數字不能循環使用, 不過要把所有可用的數字都用光也需要非常長的時間。

WAL 的緩衝區和控制結構在共享內存裡, 並且由後端操縱;它們是用輕量的鎖保護的。對共享內存的需求由緩衝區數量決定。 缺省的 WAL 緩衝區大小是 8 個 8 KB 的緩衝區,也就是 64KB。

日志位于和主數據庫文件不同的另外一個磁盤上會比較好。 你可以通過把pg_xlog目錄移動到另外一個位置( postmaster 當然得關閉), 然後在 $PGDATA 裡原來的位置創建一個指向新位置的符號鏈接來實現。

WAL 的目的是確保在數據庫記錄被修改之前, 先寫了日志,但是這個目的有可能被那些向內核謊報成功寫的磁盤驅動器破壞, 這時候,它們實際上只是緩衝了數據而並未把數據存儲到磁盤上。 這種情況下的電源失效仍然可能導致不可恢復的數據崩潰; 管理員應該確保保存 PostgreSQL 的日志文件的磁盤不會做這種虛假匯報。

在完成一個檢查點並且日志文件衝刷了之後,檢查點的位置保存在了文件 pg_control 裡。因此在需要做恢復的時候, 後端首先讀取 pg_control 和檢查點記錄; 然後它通過從檢查點記錄裡標識的日志位置開始向前掃描執行 REDO 操作。 因為數據頁的所有內容都保存在檢查點之後的第一個頁面修改的日志裡, 所以自檢查點以來的所有變化都將被恢復到一個一致的狀態。

pg_control 獲取檢查點位置可以加快恢復進程的速度, 但是為了處理 pg_control 可能的損壞, 我們實際上應該實現對現存的日志段的反向讀取順序 -- 從最新到最老 -- 這樣才能找到最後的檢查點。這些還沒有實現。