?
This document uses PHP Chinese website manual Release
WAL 是自動打開的。除了要求一些磁盤空間存放 WAL 日志以及一些必要的調(diào)節(jié)以外(參閱Section 29.4),對管理員沒有什么其它要求。
WAL 日志存放在數(shù)據(jù)目錄的pg_xlog子目錄里, 它是作為一個文件段的集合存儲的,通常每段 16MB (但在建立服務器時大小可以通過改變的 --with-wal-segsize配置選項)。每個段分為網(wǎng)頁,通常每8 KB(這個大小是可以改變的, 通過的--with-wal-blocksize配置選項)。日志記錄頭在access/xlog.h 里描述;日志內(nèi)容取決于它記錄的事件類型。段文件的名字是遞增自然數(shù),從 000000010000000000000000開始。目前這些數(shù)字不能循環(huán)使用, 不過要把所有可用的數(shù)字都用光也需要非常長的時間。
日志位于和主數(shù)據(jù)庫文件不同的另外一個磁盤上會比較好。你可以通過把pg_xlog 目錄移動到另外一個位置(此時必須關(guān)閉服務器),然后在原來的位置創(chuàng)建一個指向新位置的符號鏈接。
WAL 的目的是確保在數(shù)據(jù)庫記錄被修改之前先寫日志, 但是這個目的有可能被那些向內(nèi)核謊報成功寫入的磁盤驅(qū)動器破壞, 這時候,它們實際上只是緩沖了數(shù)據(jù)而并未把數(shù)據(jù)存儲到磁盤上。 這種情況下的電源失效仍然可能導致不可恢復的數(shù)據(jù)崩潰; 管理員應該確保保存PostgreSQL日志文件的磁盤不會做這種虛假匯報。 (查閱Section 29.1)。
在完成一個檢查點并且刷新了日志文件之后,檢查點的位置就保存在 了pg_control文件里。因此在開始做恢復的時候, 后端首先讀取pg_control和檢查點記錄; 然后通過從檢查點記錄里標識的日志位置開始向前掃描執(zhí)行 REDO 操作。 因為數(shù)據(jù)頁的所有內(nèi)容都保存在檢查點之后的第一個頁面修改的日志里 (假設(shè)full_page_writes沒有被禁用), 所以自檢查點以來的所有變化都將被恢復到一個一致的狀態(tài)。
但是為了處理pg_control可能的損壞, 我們實際上應該實現(xiàn)對現(xiàn)存日志段的反向讀取順序(從最新到最老), 這樣才能找到最后的檢查點。這些還沒有實現(xiàn)。pg_control 很小(比一個磁盤頁小),因此它出現(xiàn)只寫了一部分的問題的概率幾乎為零, 到目前為止,我們還沒有看到不能讀取 pg_control 自身的錯誤。 因此,盡管這在理論上是一個薄弱環(huán)節(jié),但是實踐中 pg_control 似乎并不會出現(xiàn)問題。