障害回復(ログ・ロールバック・ロールフォワード)
ログ(ジャーナル)・ロールバック・ロールフォワード・チェックポイントを見分けられるようになり、「どの障害で、どのファイルの、どの情報を使い、いつの状態まで戻すか」を問う過去問を自力で解けるようになる。
障害回復は「更新前・更新後のどちらを使うか」を入れ替えた選択肢が定番で、仕組みを一度押さえれば確実に取れる問題です。前のレッスンで扱ったデッドロックで強制終了されたトランザクションも、ここで学ぶロールバックで後始末されます。
このレッスンで稽古する(用語チェック・過去問)結論:回復は「ログ」と「バックアップ」の2つで行う
データベース(DB)の障害回復で覚える道具は、ログファイルとバックアップファイルの2つです。ログファイル(ジャーナルとも呼ぶ)は、DBを更新するたびに更新前の値と更新後の値を書き残しておく「更新記録」です。
ワープロにたとえると、更新前の値は「元に戻す」、更新後の値は「やり直し」に使う材料です。障害が起きたら、このログを見ながら取り消すか(ロールバック)、もう一度反映するか(ロールフォワード)を決めます。
| ファイル・処理 | 中身・役割 | 更新記録か |
|---|---|---|
| ログファイル(ジャーナル) | 更新前・更新後の値を、更新のたびに記録する | はい |
| バックアップファイル | ある時点のDBをまるごと複写したもの | いいえ(その時点の写し) |
| ダンプ | DBの内容をそのまま書き出した複写。バックアップの取り方の一つ | いいえ |
| チェックポイント | 主記憶にたまった更新を定期的にディスクへ書き出す処理。回復時間を短くする | いいえ |
| ミラーリング | 同じデータを常に別ディスクや別サイトにも書く方式 | いいえ |
「更新前後の値」「更新記録」という言葉が出たら、答えはログファイルです。
ロールバック:更新前の値で「なかったこと」にする
ロールバックは、途中で失敗したトランザクションの更新を、ログの**更新前情報(更新前ジャーナル)**を使って取り消し、トランザクション開始直前の状態に戻す処理です。トランザクションは「全部反映するか、全部なかったことにするか」のどちらかで、中途半端な状態は残しません。
使う場面は次のとおりです。
- プログラムが更新の途中で異常終了した
- デッドロックが起きて、DBMSがトランザクションを強制終了した
- システム障害が起きた時点で、まだ終わっていなかった(コミットしていない)トランザクションがあった
たとえば DELETE FROM 商品 WHERE 商品コード = 'B020' を実行中にデッドロックで異常終了すると、削除は取り消され、表は元の3行のままに戻ります。B020の行が消えた表や、一部の列だけがNULLになった表は誤りです。
ロールフォワード:バックアップに更新後の値を重ねて「直前まで再現」する
ロールフォワードは、ログの**更新後情報(更新後ジャーナル)**を反映して、障害が起きる直前の状態まで再現する処理です。いわば、成功していたはずの更新を「やり直し」で積み直す作業です。
代表的な場面は媒体障害(DBが入っているディスク自体の故障)です。手順は次の2段階です。
- バックアップファイルからDBを復元する(バックアップを取った時点に戻る)
- バックアップ以降のログの更新後情報を反映し、障害直前まで進める
このため、媒体障害に備えてログを稼働中のDBとは別の媒体に保存しておく必要があります。DBと同じディスクにログを置くと、ディスクが壊れたときにログも一緒に失われるからです。
| 比較 | ロールバック | ロールフォワード |
|---|---|---|
| 使うログ | 更新前情報(更新前ジャーナル) | 更新後情報(更新後ジャーナル) |
| 戻す先 | トランザクション開始直前の状態 | 障害発生直前の状態 |
| 方向 | 取り消して過去へ戻る | 積み直して未来へ進める |
| 主な場面 | 異常終了・デッドロック・未完了のトランザクション | 媒体障害(バックアップ復元の後)・チェックポイント後に完了したトランザクション |
| 一緒に使うもの | ログのみ | 媒体障害ではバックアップ+ログ |
チェックポイント:回復時間を短くするための「中間セーブ」
DBMS(データベース管理システム)は、速度を上げるために更新をいったん主記憶のバッファ(一時置き場)にためます。そのため、障害が起きるとバッファにしかなかった更新が失われることがあります。
チェックポイントは、定期的にバッファの内容をDBへ書き出し、「ここまでは確実にDBに反映済み」という印(チェックポイントレコード)をログに残す処理です。ゲームの中間セーブと同じで、障害が起きてもチェックポイントから回復すればよいので、回復作業の時間が短くなります。
チェックポイントでの処理は次の順番です。
- 実行中のトランザクションを一時停止する
- バッファの内容をすべてDBに書き出す
- チェックポイントレコードをログに書き出す
- トランザクションを再開する
システム障害のとき、チェックポイントまで戻ってログで回復する再始動方式をウォームスタートといいます。
システム障害のときの回復:トランザクションごとに仕分ける
停電やOSのダウンなどのシステム障害では、ディスクは無事ですがバッファの中身が失われます。このときは、チェックポイントを起点にトランザクションを2種類に仕分けます。
| 障害発生時のトランザクションの状態 | 処理 |
|---|---|
| チェックポイント後に完了(コミット)していた | ロールフォワード(更新後ログで反映し直す) |
| 障害発生時にまだ完了していなかった | ロールバック(更新前ログで取り消す) |
| チェックポイント前に完了していた | 何もしない(DBに反映済み) |
コミットとは、トランザクションの更新を確定させることです。「完了していたものは前へ、終わっていないものは後ろへ」と覚えると迷いません。
flowchart TD
A["障害が起きた"] --> B{"ディスクは無事か"}
B -- "壊れた(媒体障害)" --> C["バックアップから復元"]
C --> D["ログの更新後情報でロールフォワード"]
B -- "無事(システム障害)" --> E["チェックポイントまで戻る"]
E --> F{"トランザクションは完了していたか"}
F -- "完了していた" --> G["ロールフォワード"]
F -- "未完了" --> H["ロールバック"]
試験での問われ方
- 定義を選ぶ問題:「更新前後の値を書き出した更新記録」=ログファイル。チェックポイント(定期的な書出し)、ミラーリング(常に別ディスクへコピー)、バックアップ(ディスク単位の複写)の説明を並べて迷わせます。
- ロールバックの材料と戻り先:「更新前ジャーナル」と「トランザクション開始直前」の組合せが正解です。「更新後」や「障害直前」と組み合わせた選択肢は誤りです。
- ロールフォワードの場面:「媒体障害」「バックアップから復元した後」「チェックポイント後に完了したトランザクション」と出たらロールフォワードです。
- 定義の入れ替え:「完了したトランザクションを反映する操作をロールバックという」のように、名前と中身を入れ替えた文が誤りの選択肢として出ます。
- チェックポイントの順番:ログへの記録を、バッファの書出しより先にした並びが誤りの選択肢です。
チェックポイントの処理を正しい順に並べる
ア ①→④→③→②
イ ③→④→①→②
ウ ④→①→③→②
エ ④→③→①→②
出典:基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問22
解き方と答えを見る
- 目的を確認する:チェックポイントは「ここまでDBに反映済み」という正しい印をログに残す処理である。
- 書出し中に新しい更新が混ざると印が正しくなくなるので、最初に④「実行中のトランザクションを全て一時停止する」を行う。
- 次に③「データベースバッファの内容を全てデータベースに書き出す」を行う。
- 書出しが終わってから①「チェックポイントレコードをログに書き出す」を行う。先に印を書くと、書出しの途中で障害が起きたときに「反映済み」と誤解してしまう。
- 最後に②「トランザクションを再開する」を行う。
- 並びは ④→③→①→② となり、選択肢エと一致する。
答え:エ(④→③→①→②)
チェックポイント後に完了したトランザクションの復旧技法
ア 2 相ロック
イ シャドウページ
ウ ロールバック
エ ロールフォワード
解き方と答えを見る
- 状況を整理する:トランザクションTはチェックポイント取得後に完了し、その後システム障害が起きた。
- Tの更新はコミット済みだが、チェックポイント後なのでバッファにしか無く、障害で失われた可能性がある。
- 目標は「Tの終了直後の状態」にすること。つまり取り消すのではなく、反映し直す必要がある。
- 反映し直すには、ログの更新後情報を適用する。これはロールフォワードである。
- ほかの選択肢を除外する:ロールバックは未完了のトランザクションを取り消す処理、2相ロックは排他制御の方式、シャドウページは別の回復方式なので、いずれも当てはまらない。
答え:エ(ロールフォワード)
要点(試験直前に読む)
- ログファイル(ジャーナル)=更新前・更新後の値を記録した更新記録。バックアップやダンプはある時点の写しにすぎない。
- ロールバック=更新前ジャーナルを使い、トランザクション開始直前に戻す。異常終了やデッドロックで使う。
- ロールフォワード=更新後ジャーナルを使い、障害直前まで再現する。媒体障害ではバックアップから復元した後に行う。
- 媒体障害で使うのは「バックアップファイル+ログファイル」。ログはDBとは別の媒体に保存しておく。
- チェックポイント=バッファを定期的にDBへ書き出し、回復時間を短くする。順番は「一時停止→バッファ書出し→ログに印→再開」。
- システム障害では、チェックポイント後に完了したトランザクションはロールフォワード、未完了のトランザクションはロールバックする。
ひっかけ
- 「更新後ジャーナルで開始直前に戻す」「更新前ジャーナルで障害直前に戻す」のように、材料と戻り先をずらした選択肢が出る。ロールバックは「更新前で開始直前」、ロールフォワードは「更新後で障害直前」の組合せだけが正しい。
- 「完了したトランザクションを反映する操作をロールバックという」のように、名前と中身を入れ替えた文が出る。「完了したものは前へ(フォワード)、終わっていないものは後ろへ(バック)」で確かめる。
- ログファイルの説明の問題では、チェックポイント(定期的な書出し)、ミラーリング(常に別ディスクへコピー)、バックアップ(ディスク単位の複写)の説明が並ぶ。「更新前後の値」と「更新記録」の両方が書かれた選択肢を選ぶ。
- デッドロックで異常終了した後の表を問う問題では、行が消えた表や一部の列がNULLになった表が誤りの選択肢として出る。ロールバックで元の表に完全に戻るので、更新前の表をそのまま選ぶ。
- 媒体障害で使うファイルを問う設問では、バックアップと並ぶもう一つとして「ロールバックファイル」「トランザクションファイル」などが誤りの選択肢に出る。別媒体に保存すべきものを問う設問では、「チェックポイントデータ」「ディクショナリデータ」「インデックスデータ」が誤りの選択肢に出る。正解はどちらもログ(ログファイル/ログデータ)。
用語(16)
DBを更新するたびに、更新前と更新後の値を書き残しておく更新記録のファイル。
⚠ バックアップ・ダンプはある時点の写しで、更新の記録ではない。「更新前後の値」と書かれていればログファイル。
ログファイルの別名で、DBの更新記録のこと。
更新される前の値の記録で、ロールバックで更新を取り消すときに使う。
⚠ 更新後ジャーナルはロールフォワードで使う。「前=取り消し(バック)」と結びつける。
更新した後の値の記録で、ロールフォワードで更新を反映し直すときに使う。
⚠ 更新前ジャーナルはロールバックで使う。「後=積み直し(フォワード)」と結びつける。
更新前ジャーナルを使って、失敗したトランザクションの更新を取り消し、開始直前の状態に戻す処理。
⚠ ロールフォワードは更新後ジャーナルを使い、障害直前の状態まで進める処理。
バックアップなどの状態に、ログの更新後情報を反映して、障害直前の状態まで再現する処理。
⚠ ロールバックは更新前情報で取り消す処理。「媒体障害」「完了済みのトランザクション」ならロールフォワード。
バッファの更新内容を定期的にDBへ書き出し、その時点をログに記録して、回復時間を短くする処理。
⚠ ダンプ(DBの複写)やロールフォワード(回復処理そのもの)と混同しやすい。「定期的に書き出す」「回復時間の短縮」ならチェックポイント。
チェックポイントの時点を示すためにログに書き込む印。
⚠ バッファをDBに書き出し終えてから記録する。順番を入れ替えた選択肢に注意。
ある時点のDBの内容を、別の媒体にまるごと複写して保存したファイル。
⚠ ログファイルは更新の記録。媒体障害ではバックアップとログの両方を使う。
DBの内容をそのまま別の媒体に書き出した複写で、バックアップの取り方の一つ。
⚠ 更新の記録ではないので、「更新前後の値」を問われたらダンプは誤り。
DBが入っているディスクなどの記憶媒体そのものが壊れる障害。
⚠ システム障害はディスクが無事でバッファの中身だけが失われる障害。媒体障害ではバックアップから復元した後にロールフォワードする。
停電やOSのダウンなどでシステムが止まり、主記憶上のバッファの内容が失われる障害。
⚠ チェックポイントから、完了したトランザクションはロールフォワード、未完了のトランザクションはロールバックで回復する。
トランザクションの更新を確定させること。
⚠ コミットは回復操作ではない。「バックアップとログで回復する操作」を問われたら、答えはロールフォワード。
システム障害の後、最新のチェックポイントまで戻り、ログを使ってDBを回復して再始動する方式。
⚠ コールドスタートはチェックポイントを使わず、システムを初期状態から立ち上げ直す方式。
チェックポイントの情報を使わず、システムを初期状態から立ち上げ直す再始動方式。
⚠ 「チェックポイントまで戻ってログで回復」はウォームスタートの説明。
同じデータを常に別のディスクや別のサイトにも書き込んでおく方式。
⚠ ログファイルの説明の問題で、誤りの選択肢として出る。
このレッスンの過去問
- ログファイル(ジャーナル)の役割平成30年度 春期 基本情報技術者試験 午前 問29
- ロールバック処理(更新前ジャーナル)平成29年度 秋期 基本情報技術者試験 午前 問30
- ロールフォワードによるDB復旧平成31年度 春期 基本情報技術者試験 午前 問57
- チェックポイントの定義(DB回復時間の短縮)基本情報技術者試験 科目A免除 修了試験 20260614 実施分 問22
- 媒体障害時の復旧に用いるファイル(バックアップとログ)平成23年度 秋期 基本情報技術者試験 午前 問36