ITの教科書検索
入門読了 約9分

ロールフォワードとロールバックの違い ― 障害回復

ロールフォワードはコミット済みの更新をログでやり直し、ロールバックは未コミットの更新を取り消します。停電やディスク故障ごとの使い分けを、時系列の図で判定して確かめられます。

目次
  1. ロールフォワードとロールバックの違い
  2. ログに残るもの
  3. チェックポイントとは
  4. 障害の種類ごとの回復
  5. 時系列の図で判定する
  6. ウォームスタートとコールドスタート
  7. 練習問題

ロールフォワードとロールバックの違いは、やり直すか取り消すか

ロールフォワードは、コミット済みの更新を、ログに残した更新後の値でやり直す回復です。ロールバックは、コミットしていない更新を、ログに残した更新前の値で取り消す回復です。停電やディスク故障でデータベースが止まったとき、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が止まり、メモリの内容が消える。ディスクは無事チェックポイントの後にコミットしたものをロールフォワードし、未コミットのものをロールバックする
媒体障害ディスクが壊れて、データベースの本体が失われるバックアップを戻し、その後のコミット済みの更新をロールフォワードする

トランザクション障害では、DBMSは動き続けます。デッドロックで選ばれたトランザクションを取り消す例は、排他制御とデッドロックの記事で説明しています。

媒体障害では、チェックポイントで書き出した先のディスクごと失われます。そのため、回復の起点はチェックポイントではなく、最後に取ったバックアップです。ログはバックアップの後の分をすべて残しておく必要があり、本体とは別のディスクに置きます。

時系列の図で、どのトランザクションに何をするかを判定する

システム障害のときの扱いは、2つの問いで決まります。1つ目は、障害の時点でコミットしていたかです。2つ目は、コミットがチェックポイントより前だったかです。下の図のT1〜T5は、どれもデータを更新するトランザクションとします。

チェックポイント障害回復の扱いT1何もしないT2ロールフォワードT3ロールフォワードT4ロールバックT5ロールバックコミット障害の時点で実行中チェックポイント障害T1何もしないT2ロールフォワードT3ロールフォワードT4ロールバックT5ロールバックコミット障害の時点で実行中
システム障害のときの扱いです。チェックポイントより前にコミットしたT1は何もしません。チェックポイントの後にコミットしたT2とT3はロールフォワードし、障害の時点で終わっていないT4とT5はロールバックします。

コミットしていなかったT4とT5は、ロールバックします。コミットしていたもののうち、チェックポイントより前にコミットしたT1は何もしません。チェックポイントの後にコミットしたT2とT3は、ロールフォワードします。

T2はチェックポイントをまたいでいます。チェックポイントまでの更新はディスクにあるので、やり直すのはチェックポイントより後の更新です。T5は、チェックポイントの後に始まってまだ終わっていないトランザクションです。

T5の更新も、チェックポイントを待たずにディスクへ書き出されていることがあります。DBMSは、コミットの前でも更新したデータをディスクに書き出すことがあるためです。T5のように、チェックポイントの後に始まって更新し、障害の時点でコミットしていないものは、ロールバックします。Silberschatzらのデータベースの教科書の例でも、同じようにロールバックします。

ただし、データを読むだけのトランザクションは、取り消す更新が無いので、障害の時点で実行中でもロールバックの対象になりません。

障害の種類を選んで、T1〜T5の扱いを確かめる

障害の種類が変わると、上の図と同じT1〜T5でも扱いが変わります。次の図で種類を選ぶと、それぞれの扱いと理由が表示されます。

障害の種類
停電などでDBMSが止まり、メモリの中身が消えた場合です。ディスクは無事です。
  1. T1何もしないチェックポイントより前にコミットしたので、更新はディスクに書き出し済みです。
  2. T2ロールフォワードチェックポイントの後にコミットしました。メモリにしかなかった更新を、更新後ログで再現します。
  3. T3ロールフォワードチェックポイントの後に始まってコミットしました。更新後ログで再現します。
  4. T4ロールバックコミットしていません。チェックポイントで書き出された途中の更新を、更新前ログで取り消します。
  5. T5ロールバックコミットしていません。ディスクに書き出された更新があれば、更新前ログで取り消します。
回復に使うもの:直前のチェックポイントと、その後のログ

同じT1でも、システム障害では何もしませんが、媒体障害ではロールフォワードします。チェックポイントで書き出した内容が、壊れたディスクと一緒に失われるためです。障害の後にどこまで戻せるかの目標は、BCPとDRの記事のRPOに当たります。

ウォームスタートとコールドスタートは、立ち上げ直す起点が違う

障害の後にシステムを立ち上げ直す方法にも、2つの呼び名があります。ウォームスタートは、ディスクとログに残った状態を引き継ぎ、障害の直前から処理を再開する立ち上げ方です。コールドスタートは、それまでの処理の状態を引き継がず、初めの状態から立ち上げ直す方法です。

システム障害のようにディスクが無事なら、ログを使った回復の後にウォームスタートできます。ディスクが壊れた場合は、先にバックアップから戻す作業が必要です。

参考にした資料

練習問題(全5問)

Q1コミット済みの更新を、更新後ログを使って再現する処理はどれ?
Q2システム障害が起きた。直前のチェックポイントより前にコミットしたトランザクションはどう扱う?
Q3システム障害が起きた。チェックポイントの前に始まり、障害の時点でコミットしていなかったトランザクションはどう扱う?
Q4データベースを置いたディスクが壊れた。回復に主に使うものの組み合わせはどれ?
Q5あるトランザクションが、デッドロックで処理を続けられなくなった。DBMSが行う回復はどれ?

選んでから「採点する」を押すと、解説つきで答え合わせができます。

関連記事

おすすめの本 PR

セキュリティとデータベースは、基本情報技術者試験の対策本でまとめて学べます。

目的別の本の選び方を見る

データベースの記事を続けて読む

データベース 全36本中31本目