Postgres 筆記 – Write Ahead Log (WAL)
使用 Postgres 過程中,經常看到 WAL 這個詞。
WAL 概念是『先把修改用日誌方式存到 Disk,這比較省操作成本,先不忙著以正式的數據結構(Index, Table)去存到 Disk,這比較花功夫』
因為以同樣要對 Disk 操作來說,『存 WAL 』的 cost 比『操作正式的數據結構(Index, Table)』的 cost 低。
這樣就可以快一點完成 COMMIT,給 client 端快一點的回應。
這部分可以參考 Postgres 文件的 29.2. Write-Ahead Logging (WAL)
所以,Postgres 完成 COMMIT 時,主要要做到這兩件事:
- 把 WAL log 落到 Disk 上(對 Disk 存取)
- shared buffers 內的資料(Index, Table) 修改完成 (對 RAM 存取)
這樣就可以了。
因為 shared buffers 已經改好,自然經得住後續查詢,等到之後,Postgres 會慢慢地,再把 shared buffers 內的資料落到 Disk 上,這樣就塵埃落定了。 (Checkpoint)
即使因為意外停掉,雖然 shared buffers 內的資料掉了,但還可以從 WAL 回放(Redo, roll-forward recovery),一直到 shared buffers 內的資料恢復到正確的樣子,經得起查詢為止。
參考資料:
Leave a Reply