ロールフォワードとロールバックの違い ― 障害回復
ロールフォワードは
ロールフォワードとロールバックの違いは、やり直すか取り消すか
ロールフォワードは、コミット済みの更新を、ログに残した更新後の値でやり直す回復です。ロールバックは、コミットしていない更新を、ログに残した更新前の値で取り消す回復です。停電やディスク故障でデータベースが止まったとき、DBMSはこの2つを使い分けて、矛盾のない状態に戻します。停電のようなシステム障害でどちらを使うかは、障害の時点でコミットしていたかと、コミットがチェックポイントより前か後かで決まります。コミットとロールバックの意味は、トランザクションとACID特性の記事で説明しています。
ロールフォワードはフォワードリカバリ、ロールバックはバックワードリカバリとも呼びます。ログを前に向かって読み進めるか、後ろに向かってさかのぼるかの違いです。
ログには、更新前の値と更新後の値が残る
例として、口座Aの残高を1000円から950円に書き換えるトランザクションがあるとします。DBMSは、この書き換えをデータベースの本体に反映する前に、ログに記録します。このログを残すファイルを、ジャーナルファイルまたはログファイルと呼びます。
ログには、書き換える前の1000円と、書き換えた後の950円の両方を残します。前の値の記録を更新前ログと呼び、ロールバックで元に戻すときに使います。後の値の記録を更新後ログと呼び、ロールフォワードでやり直すときに使います。
ログを本体より先に書く順序を守ると、コミットの時点で本体まで書き出さなくて済みます。ログさえ残っていれば、障害の後にやり直せるためです。この方法をWAL(Write-Ahead Logging)と呼びます。PostgreSQLの文書も、WALを使ったやり直しをroll-forward recoveryと説明しています。
チェックポイントとは、メモリの更新をディスクに書き出した時点
DBMSは、書き換えたデータをしばらくメモリに置いたまま処理を進めます。そのため、コミット済みの更新でも、まだディスクに書かれていないものがあります。停電でメモリの内容が消えると、その更新はディスクから失われます。
そこでDBMSは、ときどきメモリ上の更新をまとめてディスクに書き出し、その時点をログに記録します。この時点をチェックポイントと呼びます。チェックポイントより前にコミットした更新はディスクに入っているので、ロールフォワードはチェックポイントから始められます。
チェックポイントを取る間隔は製品の設定で決まります。たとえばPostgreSQLの初期設定では、5分ごとか、ログが1GBに近づいたときのどちらか早い方で取ります。間隔を短くすると回復は速くなりますが、書き出しの負荷は増えます。
障害の種類ごとに、ロールフォワードとロールバックを使い分ける
データベースの障害は、何が失われるかで3つに分けて考えます。1つのトランザクションだけが止まるのか、メモリが消えるのか、ディスクが壊れるのかの違いです。
| 障害の | 起きる | 回復の |
|---|---|---|
| トランザクション | 1つの | その |
| システム障害 | 停電などで | チェックポイントの |
| 媒体障害 | ディスクが | バックアップを |
トランザクション障害では、DBMSは動き続けます。デッドロックで選ばれたトランザクションを取り消す例は、排他制御とデッドロックの記事で説明しています。
媒体障害では、チェックポイントで書き出した先のディスクごと失われます。そのため、回復の起点はチェックポイントではなく、最後に取ったバックアップです。ログはバックアップの後の分をすべて残しておく必要があり、本体とは別のディスクに置きます。
時系列の図で、どのトランザクションに何をするかを判定する
システム障害のときの扱いは、2つの問いで決まります。1つ目は、障害の時点でコミットしていたかです。2つ目は、コミットがチェックポイントより前だったかです。下の図のT1〜T5は、どれもデータを更新するトランザクションとします。
コミットしていなかったT4とT5は、ロールバックします。コミットしていたもののうち、チェックポイントより前にコミットしたT1は何もしません。チェックポイントの後にコミットしたT2とT3は、ロールフォワードします。
T2はチェックポイントをまたいでいます。チェックポイントまでの更新はディスクにあるので、やり直すのはチェックポイントより後の更新です。T5は、チェックポイントの後に始まってまだ終わっていないトランザクションです。
T5の更新も、チェックポイントを待たずにディスクへ書き出されていることがあります。DBMSは、コミットの前でも更新したデータをディスクに書き出すことがあるためです。T5のように、チェックポイントの後に始まって更新し、障害の時点でコミットしていないものは、ロールバックします。Silberschatzらのデータベースの教科書の例でも、同じようにロールバックします。
ただし、データを読むだけのトランザクションは、取り消す更新が無いので、障害の時点で実行中でもロールバックの対象になりません。
障害の種類を選んで、T1〜T5の扱いを確かめる
障害の種類が変わると、上の図と同じT1〜T5でも扱いが変わります。次の図で種類を選ぶと、それぞれの扱いと理由が表示されます。
- T1何もしないコミット済みで、
障害と 関係ありません。 - T2何もしないコミット済みで、
障害と 関係ありません。 - T3何もしないコミット済みで、
障害と 関係ありません。 - T4ロールバック途中まで
行った 更新を、 更新前ログで 元の 値に 戻します。 - T5何もしない障害の
影響を 受けず、 そのまま 処理を 続けます。
- T1何もしないチェックポイントより
前に コミットしたので、 更新は ディスクに 書き出し済みです。 - T2ロールフォワードチェックポイントの
後に コミットしました。 メモリに しかなかった 更新を、 更新後ログで 再現します。 - T3ロールフォワードチェックポイントの
後に 始まって コミットしました。 更新後ログで 再現します。 - T4ロールバックコミットしていません。
チェックポイントで 書き出された 途中の 更新を、 更新前ログで 取り消します。 - T5ロールバックコミットしていません。
ディスクに 書き出された 更新が あれば、 更新前ログで 取り消します。
- T1ロールフォワードチェックポイントで
書き出した 先の ディスクが 壊れたので、 バックアップを 戻してから 更新後ログで 再現します。 - T2ロールフォワードバックアップの
後に コミットしたので、 更新後ログで 再現します。 - T3ロールフォワードバックアップの
後に コミットしたので、 更新後ログで 再現します。 - T4何もしないコミットしていないので
再現しません。 戻した バックアップにも、 この 更新は 入っていません。 - T5何もしないコミットしていないので
再現しません。 戻した バックアップにも、 この 更新は 入っていません。
同じT1でも、システム障害では何もしませんが、媒体障害ではロールフォワードします。チェックポイントで書き出した内容が、壊れたディスクと一緒に失われるためです。障害の後にどこまで戻せるかの目標は、BCPとDRの記事のRPOに当たります。
ウォームスタートとコールドスタートは、立ち上げ直す起点が違う
障害の後にシステムを立ち上げ直す方法にも、2つの呼び名があります。ウォームスタートは、ディスクとログに残った状態を引き継ぎ、障害の直前から処理を再開する立ち上げ方です。コールドスタートは、それまでの処理の状態を引き継がず、初めの状態から立ち上げ直す方法です。
システム障害のようにディスクが無事なら、ログを使った回復の後にウォームスタートできます。ディスクが壊れた場合は、先にバックアップから戻す作業が必要です。
参考にした資料
- Silberschatz・Korth・Sudarshan「Database System Concepts」第19章のスライド(障害の分類、ログの更新前・更新後の値、チェックポイントの例、媒体障害の回復)
- PostgreSQL 18 文書「Write-Ahead Logging (WAL)」
- PostgreSQL 18 文書「WAL Configuration」(チェックポイントの働きと既定の間隔)
- PostgreSQL 18 文書「Continuous Archiving and Point-in-Time Recovery (PITR)」
練習問題(全5問)
正解:ロールフォワード
コミット済みの
正解:何もしない
チェックポイントで、
正解:ロールバックする
コミットしていない
正解:バックアップと
媒体障害では、
正解:
トランザクション
選んでから「採点する」を押すと、解説つきで答え合わせができます。
関連記事
おすすめの本 PR
セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

