ログ先行書き込み(WAL)はトランザクションのログを残すための一般的な手法です。 詳細にわたって全てを網羅しているとは言えませんが、たいていのトランザクション処理について書かれた書籍に記載されています。 簡単に言うと、WALの基本的な考え方は、(テーブルやインデックスがある)データファイルへの変更は、ログへの記録、つまり、変更内容を記述したログレコードが永続格納領域に書き出された後にのみ書き出されなければならないということです。 このような手順に従って処理を行えば、たとえクラッシュが起きてもログを使ってデータベースをリカバリすることができるため、トランザクションのコミットの度にデータページをディスクに吐き出す必要がなくなります。 リカバリの時点では、まず、データページに対してまだ行われていない変更分はログレコードを使って再実行されます(これがREDOとして知られているロールフォワードリカバリです)。
WALを採用する主な利点はディスクへの書き込み回数が大幅に減ることです。
と言うのも、トランザクションコミットの時にそのトランザクションで変更された全てのデータファイルではなく、ログファイルだけをディスクに吐き出せばよいからです。
マルチユーザ環境では、多くのトランザクションのコミットをログファイルの1回のfsync()
で済ますことができます。
それだけではなく、ログファイルへの書き込みはシーケンシャルに行われるため、データページを吐き出すコストに比べログファイルの同期はずっと低コストになります。
これは特に、データ格納領域の様々な部分を変更する小さなトランザクションを多く扱うサーバで顕著に現れます。
また、WALにより、項23.3で説明するオンラインバックアップとポイントインタイムリカバリをサポートすることができます。 WALのデータを保持することにより、そのWALデータが範囲内とする任意の時点に戻すことができます。 単純にデータベースの主となる物理バックアップをインストールし、WALログを目的の時点まで単に再生することで実現できます。 さらに、物理バックアップはインスタンス化可能なデータベース状態のスナップショットである必要もありません。 ある程度の時間を経過して作成されたバックアップであっても、その期間用のWALを再生することにより、内部の不整合を修復します。