前言
WAL 是一種 Tx Log實踐機制
WAL 核心概念是先寫 tx log,在把資料寫資料,資料的修改必须發生在寫入 Tx Log之後,使用 WAL 紀錄資料庫系統在commit transaction
使用 WAL 機制後我們不需要在每次 Commit Transaction 後就把資料 flush 到 Disk 上(提高IO效率), WAL 需要保證 Dirty Block flush 到 Disk 之前,該 Block 對應 Tx log 紀錄已經 flush 到 Disk 中
因為假如系統突然崩潰我們可以藉由 WAL 寫入 Tx Log 來 roll-forward recovery (REDO)
WAL 寫入時機簡介
LSN
序號是一個 globale 變數(透過 info_lck
輕量鎖設計避免同一時間取得同一個 LSN )
寫入資料會經由下面幾個步驟
- Log (LSN–Log) 是一個有順序性標誌的紀錄 (可以想像是一個 sequence ) ,一開始存在 RAM 中,在 RAM 中有一個 flushLSN 位置會記錄 log LSN 寫入 Disk 最後位置.
- 每個 block 在 pageheader 會有一個欄位
PageXLogRecPtr pd_lsn;
指到 log 紀錄位置,此位置在 Dirty Block 存在 buffer Pool 時就會決定 - 最後把 Dirty Block flush 到 Disk 之前 postgresSQL 會檢查是否滿足此條件
pd_lsn <= flushLSN
,確保 Log 已經寫入 Disk 上才會把資料 flush 到資料庫中 - 如果是
synchronous_commit = ON
代表同步提交,在 Transaction commit 時會把對應的 Tx Log 馬上 flush 進 Disk中才能返回成功
經過上面步驟我們就可以確保 先寫 Tx Log 歷程,後寫 Dirty Block