WAL(1)

起動後またはチェックポイントが発生した後に、バッファのページを最初に更新する場合,ページ全体をログに出力する。ページのバックアップがないとbackground writerがページを書き込んでいるときにbackendがクラッシュした場合、リカバリが難しくなる。(例えばページの半分だけwriteしてクラッシュした場合など)

ページ全体をログに出力するかどうかは,XLogInsertからXLogCheckBufferを実行してチェックしている。XLogCheckBufferではページのLSNとRedoRecPtr(前回のチェックポイント時のLSN)が比較され,page->pd_lsn <= RedoRecPtrだったらページをバックアップする。

page->pd_lsnはheap_insertなどでページを更新するたびに現在のRecPtrに書き換えられるので,どんどん進んでいく。RedoRecPtrはチェックポイントのときに更新される。
同じページを何度も更新するときは,1回目の更新ログと一緒にページ全体がログに出力される。2回目以降の更新では,ページ全体はログに出力されずに更新内容のみログに出力される。