資格道場 › レッスン一覧 › データベース
データベース・12/13・10分

障害回復(ログ・ロールバック・ロールフォワード)

ゴール

ログ(ジャーナル)・ロールバック・ロールフォワード・チェックポイントを見分けられるようになり、「どの障害で、どのファイルの、どの情報を使い、いつの状態まで戻すか」を問う過去問を自力で解けるようになる。

障害回復は「更新前・更新後のどちらを使うか」を入れ替えた選択肢が定番で、仕組みを一度押さえれば確実に取れる問題です。前のレッスンで扱ったデッドロックで強制終了されたトランザクションも、ここで学ぶロールバックで後始末されます。

このレッスンで稽古する(用語チェック・過去問)

結論:回復は「ログ」と「バックアップ」の2つで行う

データベース(DB)の障害回復で覚える道具は、ログファイルとバックアップファイルの2つです。ログファイル(ジャーナルとも呼ぶ)は、DBを更新するたびに更新前の値と更新後の値を書き残しておく「更新記録」です。

ワープロにたとえると、更新前の値は「元に戻す」、更新後の値は「やり直し」に使う材料です。障害が起きたら、このログを見ながら取り消すか(ロールバック)、もう一度反映するか(ロールフォワード)を決めます。

ファイル・処理 中身・役割 更新記録か
ログファイル(ジャーナル) 更新前・更新後の値を、更新のたびに記録する はい
バックアップファイル ある時点のDBをまるごと複写したもの いいえ(その時点の写し)
ダンプ DBの内容をそのまま書き出した複写。バックアップの取り方の一つ いいえ
チェックポイント 主記憶にたまった更新を定期的にディスクへ書き出す処理。回復時間を短くする いいえ
ミラーリング 同じデータを常に別ディスクや別サイトにも書く方式 いいえ

「更新前後の値」「更新記録」という言葉が出たら、答えはログファイルです。

ロールバック:更新前の値で「なかったこと」にする

ロールバックは、途中で失敗したトランザクションの更新を、ログの**更新前情報(更新前ジャーナル)**を使って取り消し、トランザクション開始直前の状態に戻す処理です。トランザクションは「全部反映するか、全部なかったことにするか」のどちらかで、中途半端な状態は残しません。

使う場面は次のとおりです。

  • プログラムが更新の途中で異常終了した
  • デッドロックが起きて、DBMSがトランザクションを強制終了した
  • システム障害が起きた時点で、まだ終わっていなかった(コミットしていない)トランザクションがあった

たとえば DELETE FROM 商品 WHERE 商品コード = 'B020' を実行中にデッドロックで異常終了すると、削除は取り消され、表は元の3行のままに戻ります。B020の行が消えた表や、一部の列だけがNULLになった表は誤りです。

ロールバック=過去へ戻る開始直前B020を削除中異常終了更新前情報で取り消す元の3行のまま(正)1行目B020の行3行目B020が消えた表(誤)1行目消えたまま3行目
B020を削除している途中で異常終了したら、更新前情報で開始直前まで戻すので、表は元の3行のまま残る。

ロールフォワード:バックアップに更新後の値を重ねて「直前まで再現」する

ロールフォワードは、ログの**更新後情報(更新後ジャーナル)**を反映して、障害が起きる直前の状態まで再現する処理です。いわば、成功していたはずの更新を「やり直し」で積み直す作業です。

代表的な場面は媒体障害(DBが入っているディスク自体の故障)です。手順は次の2段階です。

  1. バックアップファイルからDBを復元する(バックアップを取った時点に戻る)
  2. バックアップ以降のログの更新後情報を反映し、障害直前まで進める

このため、媒体障害に備えてログを稼働中のDBとは別の媒体に保存しておく必要があります。DBと同じディスクにログを置くと、ディスクが壊れたときにログも一緒に失われるからです。

比較 ロールバック ロールフォワード
使うログ 更新前情報(更新前ジャーナル) 更新後情報(更新後ジャーナル)
戻す先 トランザクション開始直前の状態 障害発生直前の状態
方向 取り消して過去へ戻る 積み直して未来へ進める
主な場面 異常終了・デッドロック・未完了のトランザクション 媒体障害(バックアップ復元の後)・チェックポイント後に完了したトランザクション
一緒に使うもの ログのみ 媒体障害ではバックアップ+ログ
ロールフォワード=未来へ進めるバックアップ取得更新のたびに記録媒体障害①復元取得時点へ②更新後情報を順に反映障害直前の状態DBのディスク故障ログ(別の媒体)無事同じディスクならログも一緒に失われる
媒体障害では、①バックアップ取得の時点へ復元し、②ログの更新後情報を目盛りの順に反映して障害直前の状態まで進める。ログは別の媒体に置くので無事に残る。

チェックポイント:回復時間を短くするための「中間セーブ」

DBMS(データベース管理システム)は、速度を上げるために更新をいったん主記憶のバッファ(一時置き場)にためます。そのため、障害が起きるとバッファにしかなかった更新が失われることがあります。

チェックポイントは、定期的にバッファの内容をDBへ書き出し、「ここまでは確実にDBに反映済み」という印(チェックポイントレコード)をログに残す処理です。ゲームの中間セーブと同じで、障害が起きてもチェックポイントから回復すればよいので、回復作業の時間が短くなります。

チェックポイントでの処理は次の順番です。

  1. 実行中のトランザクションを一時停止する
  2. バッファの内容をすべてDBに書き出す
  3. チェックポイントレコードをログに書き出す
  4. トランザクションを再開する

システム障害のとき、チェックポイントまで戻ってログで回復する再始動方式をウォームスタートといいます。

①実行中のトランザクションを一時停止②バッファの内容をすべてDBへ書き出すバッファ(主記憶)DB(ディスク)③チェックポイントレコードをログへログチェックポイントレコード④トランザクションを再開
チェックポイントは①一時停止→②バッファをDBへ書出し→③ログにチェックポイントレコードを書く→④再開、の順に進む。

システム障害のときの回復:トランザクションごとに仕分ける

停電やOSのダウンなどのシステム障害では、ディスクは無事ですがバッファの中身が失われます。このときは、チェックポイントを起点にトランザクションを2種類に仕分けます。

障害発生時のトランザクションの状態 処理
チェックポイント後に完了(コミット)していた ロールフォワード(更新後ログで反映し直す)
障害発生時にまだ完了していなかった ロールバック(更新前ログで取り消す)
チェックポイント前に完了していた 何もしない(DBに反映済み)

コミットとは、トランザクションの更新を確定させることです。「完了していたものは前へ、終わっていないものは後ろへ」と覚えると迷いません。

flowchart TD
  A["障害が起きた"] --> B{"ディスクは無事か"}
  B -- "壊れた(媒体障害)" --> C["バックアップから復元"]
  C --> D["ログの更新後情報でロールフォワード"]
  B -- "無事(システム障害)" --> E["チェックポイントまで戻る"]
  E --> F{"トランザクションは完了していたか"}
  F -- "完了していた" --> G["ロールフォワード"]
  F -- "未完了" --> H["ロールバック"]
チェックポイント障害T1何もしないチェックポイント前に完了T2ロールフォワードチェックポイント後に完了T3ロールバック障害時に未完了いつ完了したかで処理が決まる
チェックポイントの線と障害の線に対して各トランザクションがいつ完了したかで、何もしない・ロールフォワード・ロールバックに仕分ける。

試験での問われ方

  • 定義を選ぶ問題:「更新前後の値を書き出した更新記録」=ログファイル。チェックポイント(定期的な書出し)、ミラーリング(常に別ディスクへコピー)、バックアップ(ディスク単位の複写)の説明を並べて迷わせます。
  • ロールバックの材料と戻り先:「更新前ジャーナル」と「トランザクション開始直前」の組合せが正解です。「更新後」や「障害直前」と組み合わせた選択肢は誤りです。
  • ロールフォワードの場面:「媒体障害」「バックアップから復元した後」「チェックポイント後に完了したトランザクション」と出たらロールフォワードです。
  • 定義の入れ替え:「完了したトランザクションを反映する操作をロールバックという」のように、名前と中身を入れ替えた文が誤りの選択肢として出ます。
  • チェックポイントの順番:ログへの記録を、バッファの書出しより先にした並びが誤りの選択肢です。
例題 1

チェックポイントの処理を正しい順に並べる

DBMSのチェックポイント時点の処理を正しい順番に並べたものはどれか。 ① チェックポイントレコードをログに書き出す。 ② トランザクションを再開する。 ③ データベースバッファの内容を全てデータベースに書き出す。 ④ 実行中のトランザクションを全て一時停止する。

ア ①→④→③→②
イ ③→④→①→②
ウ ④→①→③→②
エ ④→③→①→②

出典:基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問22

解き方と答えを見る
  1. 目的を確認する:チェックポイントは「ここまでDBに反映済み」という正しい印をログに残す処理である。
  2. 書出し中に新しい更新が混ざると印が正しくなくなるので、最初に④「実行中のトランザクションを全て一時停止する」を行う。
  3. 次に③「データベースバッファの内容を全てデータベースに書き出す」を行う。
  4. 書出しが終わってから①「チェックポイントレコードをログに書き出す」を行う。先に印を書くと、書出しの途中で障害が起きたときに「反映済み」と誤解してしまう。
  5. 最後に②「トランザクションを再開する」を行う。
  6. 並びは ④→③→①→② となり、選択肢エと一致する。

答え:エ(④→③→①→②)

例題 2

チェックポイント後に完了したトランザクションの復旧技法

トランザクション T はチェックポイント取得後に完了したが,その後にシステム障害が発生した。トランザクション T の更新内容をその終了直後の状態にするために用いられる復旧技法はどれか。ここで,チェックポイントの他に,トランザクションログを利用する。

ア 2 相ロック
イ シャドウページ
ウ ロールバック
エ ロールフォワード

出典:平成28年度 秋期 基本情報技術者試験 午前 問30

解き方と答えを見る
  1. 状況を整理する:トランザクションTはチェックポイント取得後に完了し、その後システム障害が起きた。
  2. Tの更新はコミット済みだが、チェックポイント後なのでバッファにしか無く、障害で失われた可能性がある。
  3. 目標は「Tの終了直後の状態」にすること。つまり取り消すのではなく、反映し直す必要がある。
  4. 反映し直すには、ログの更新後情報を適用する。これはロールフォワードである。
  5. ほかの選択肢を除外する:ロールバックは未完了のトランザクションを取り消す処理、2相ロックは排他制御の方式、シャドウページは別の回復方式なので、いずれも当てはまらない。

答え:エ(ロールフォワード)

要点(試験直前に読む)

  • ログファイル(ジャーナル)=更新前・更新後の値を記録した更新記録。バックアップやダンプはある時点の写しにすぎない。
  • ロールバック=更新前ジャーナルを使い、トランザクション開始直前に戻す。異常終了やデッドロックで使う。
  • ロールフォワード=更新後ジャーナルを使い、障害直前まで再現する。媒体障害ではバックアップから復元した後に行う。
  • 媒体障害で使うのは「バックアップファイル+ログファイル」。ログはDBとは別の媒体に保存しておく。
  • チェックポイント=バッファを定期的にDBへ書き出し、回復時間を短くする。順番は「一時停止→バッファ書出し→ログに印→再開」。
  • システム障害では、チェックポイント後に完了したトランザクションはロールフォワード、未完了のトランザクションはロールバックする。

ひっかけ

  • 「更新後ジャーナルで開始直前に戻す」「更新前ジャーナルで障害直前に戻す」のように、材料と戻り先をずらした選択肢が出る。ロールバックは「更新前で開始直前」、ロールフォワードは「更新後で障害直前」の組合せだけが正しい。
  • 「完了したトランザクションを反映する操作をロールバックという」のように、名前と中身を入れ替えた文が出る。「完了したものは前へ(フォワード)、終わっていないものは後ろへ(バック)」で確かめる。
  • ログファイルの説明の問題では、チェックポイント(定期的な書出し)、ミラーリング(常に別ディスクへコピー)、バックアップ(ディスク単位の複写)の説明が並ぶ。「更新前後の値」と「更新記録」の両方が書かれた選択肢を選ぶ。
  • デッドロックで異常終了した後の表を問う問題では、行が消えた表や一部の列がNULLになった表が誤りの選択肢として出る。ロールバックで元の表に完全に戻るので、更新前の表をそのまま選ぶ。
  • 媒体障害で使うファイルを問う設問では、バックアップと並ぶもう一つとして「ロールバックファイル」「トランザクションファイル」などが誤りの選択肢に出る。別媒体に保存すべきものを問う設問では、「チェックポイントデータ」「ディクショナリデータ」「インデックスデータ」が誤りの選択肢に出る。正解はどちらもログ(ログファイル/ログデータ)。

用語(16)

ログファイル ろぐふぁいる(ジャーナルファイル)
DBを更新するたびに、更新前と更新後の値を書き残しておく更新記録のファイル。
⚠ バックアップ・ダンプはある時点の写しで、更新の記録ではない。「更新前後の値」と書かれていればログファイル。
ジャーナル じゃーなる(journal)
ログファイルの別名で、DBの更新記録のこと。
更新前ジャーナル こうしんまえじゃーなる(更新前ログ・更新前情報)
更新される前の値の記録で、ロールバックで更新を取り消すときに使う。
⚠ 更新後ジャーナルはロールフォワードで使う。「前=取り消し(バック)」と結びつける。
更新後ジャーナル こうしんごじゃーなる(更新後ログ・更新後情報)
更新した後の値の記録で、ロールフォワードで更新を反映し直すときに使う。
⚠ 更新前ジャーナルはロールバックで使う。「後=積み直し(フォワード)」と結びつける。
ロールバック ろーるばっく(rollback)
更新前ジャーナルを使って、失敗したトランザクションの更新を取り消し、開始直前の状態に戻す処理。
⚠ ロールフォワードは更新後ジャーナルを使い、障害直前の状態まで進める処理。
ロールフォワード ろーるふぉわーど(rollforward)
バックアップなどの状態に、ログの更新後情報を反映して、障害直前の状態まで再現する処理。
⚠ ロールバックは更新前情報で取り消す処理。「媒体障害」「完了済みのトランザクション」ならロールフォワード。
チェックポイント ちぇっくぽいんと(checkpoint)
バッファの更新内容を定期的にDBへ書き出し、その時点をログに記録して、回復時間を短くする処理。
⚠ ダンプ(DBの複写)やロールフォワード(回復処理そのもの)と混同しやすい。「定期的に書き出す」「回復時間の短縮」ならチェックポイント。
チェックポイントレコード ちぇっくぽいんとれこーど
チェックポイントの時点を示すためにログに書き込む印。
⚠ バッファをDBに書き出し終えてから記録する。順番を入れ替えた選択肢に注意。
バックアップファイル ばっくあっぷふぁいる
ある時点のDBの内容を、別の媒体にまるごと複写して保存したファイル。
⚠ ログファイルは更新の記録。媒体障害ではバックアップとログの両方を使う。
ダンプ だんぷ(dump)
DBの内容をそのまま別の媒体に書き出した複写で、バックアップの取り方の一つ。
⚠ 更新の記録ではないので、「更新前後の値」を問われたらダンプは誤り。
媒体障害 ばいたいしょうがい
DBが入っているディスクなどの記憶媒体そのものが壊れる障害。
⚠ システム障害はディスクが無事でバッファの中身だけが失われる障害。媒体障害ではバックアップから復元した後にロールフォワードする。
システム障害 しすてむしょうがい
停電やOSのダウンなどでシステムが止まり、主記憶上のバッファの内容が失われる障害。
⚠ チェックポイントから、完了したトランザクションはロールフォワード、未完了のトランザクションはロールバックで回復する。
コミット こみっと(commit)
トランザクションの更新を確定させること。
⚠ コミットは回復操作ではない。「バックアップとログで回復する操作」を問われたら、答えはロールフォワード。
ウォームスタート うぉーむすたーと(warm start)
システム障害の後、最新のチェックポイントまで戻り、ログを使ってDBを回復して再始動する方式。
⚠ コールドスタートはチェックポイントを使わず、システムを初期状態から立ち上げ直す方式。
コールドスタート こーるどすたーと(cold start)
チェックポイントの情報を使わず、システムを初期状態から立ち上げ直す再始動方式。
⚠ 「チェックポイントまで戻ってログで回復」はウォームスタートの説明。
ミラーリング みらーりんぐ(mirroring)
同じデータを常に別のディスクや別のサイトにも書き込んでおく方式。
⚠ ログファイルの説明の問題で、誤りの選択肢として出る。

このレッスンの過去問

このレッスンで稽古する