FE EXAM

ログファイル(更新履歴の記録)

データベースの更新履歴を記録し障害回復に用いるファイル。

DIAGRAM
更新前ログ更新後ログ
例: 残高を 300 → 200 に更新したときのログログファイル(時系列で追記)更新前ログ(before image)残高 = 300(変更前の値)→ 取り消し(ロールバック)に使う更新後ログ(after image)残高 = 200(変更後の値)→ やり直し(ロールフォワード)に使う未確定のまま障害更新前ログの 300 に戻す(変更をなかったことに)= ロールバック確定後にディスク未反映で障害更新後ログの 200 を再適用(確定結果を取り戻す)= ロールフォワード
解説

📌
ログファイルとは

更新のたびに「何を・どう変えたか」を追記BEGIN T1残高 300 → 200COMMIT T1

ログファイルとは、データベースの更新履歴を記録し、障害回復に用いるファイルです。「いつ・どのトランザクションが・どのデータを・どう変えたか」を、起きた順に追記していきます。

ログファイルは、電源が切れても消えないディスク上に保存されます。万一システムが停止しても、このログをたどれば「どこまで進んでいたか」を再現できるため、データを正しい状態に戻せます。

身近な例で考えると、銀行の通帳のようなものです。残高そのもの(データ本体)が分からなくなっても、「○月○日に1万円引き出し」といった記録(ログ)が残っていれば、正しい残高を計算し直せます。上の図解で、1つの更新が更新前ログと更新後ログとして残る様子を確認できます。

📌
更新前/更新後ログ

ログには、1つの更新について「変える前の値」と「変えた後の値」の両方が記録されます。これを更新前ログ・更新後ログと呼びます。
更新前ログ(before image):変更する前の古い値(例: 残高 300)
更新後ログ(after image):変更した後の新しい値(例: 残高 200)

この2種類は、障害回復のときに使い分けられます。
ロールバック(取り消し):未確定のまま障害が起きたとき、更新前ログを使って古い値に戻す
ロールフォワード(やり直し):確定済みなのにディスク本体へ未反映だったとき、更新後ログを使って新しい値を再適用する

覚え方は、「前に戻したいなら更新前ログ、先に進めたいなら更新後ログ」です。上の図解の下段で、どちらのログがどちらの回復に使われるかを色で対応させています。

📌
WALの考え方

① 先にログ → ② 後でデータ本体① ログを書く先に記録② データ更新後で反映

WAL(Write Ahead Log=ログ先書き)とは、データ本体を書き換える前に、必ずその更新内容をログへ書き出しておくという考え方です。順番を「ログが先、データが後」と決めるのがポイントです。

なぜ先にログを書くのでしょうか。もしデータ本体を更新している最中に障害が起きても、ログがすでに残っていれば、そこから回復できるからです。逆にログより先にデータを書いてしまうと、ログがない更新が生まれ、回復できなくなる恐れがあります。

身近な例で考えると、料理の前にレシピをメモしておくようなものです。先に手順を書き留めておけば、途中で中断しても「どこまでやったか」をたどって再開できます。WALは、トランザクションの永続性を支える基本の仕組みです。

練習問題

🎯
基本情報技術者 練習問題

Q1.データベースのログファイルの説明として最も適切なものはどれか。
A.データベースの更新履歴を記録し障害回復に用いるファイル
B.行を高速に検索するための索引
C.複数の表から導かれる仮想的な表
D.利用者の操作画面を定義するファイル
Q2.ログファイルに記録される「更新前ログ」と「更新後ログ」の使われ方として正しいものはどれか。
A.更新前ログは取り消し(ロールバック)に、更新後ログはやり直し(ロールフォワード)に使う
B.更新前ログはやり直しに、更新後ログは取り消しに使う
C.どちらも検索の高速化に使う
D.更新前ログだけが回復に使われ、更新後ログは使われない
Q3.WAL(ログ先書き)の考え方として正しいものはどれか。
A.データ本体を更新する前に、その更新内容をログに書き出しておく
B.データ本体を更新した後で、最後にまとめてログを書く
C.ログは書かず、データ本体だけを更新する
D.ログとデータを同時に1つのファイルへ書く

関連コンテンツ