データベーススペシャリスト 2015年 午前2 問05
問題文
DBMSが取得するログに関する記述として、適切なものはどれか。
選択肢
ア:トランザクションの取消しに備えて、データベースの更新されたページに対する更新後情報を取得する。
イ:媒体障害からの復旧に備えて、データベースの更新されたページに対する更新前情報を取得する。
ウ:ロールバック後のトランザクション再実行に備えて、データベースの更新されたページに対する更新後情報を取得する。
エ:ロールフォワードに備えて、データベースの更新されたページに対する更新後情報を取得する。(正解)
🔒 解説は解答すると表示されます
更新前後ログの役割【午前2解説】
正解の理由
データベース復旧における「ロールフォワード(REDO)」は、障害時にディスク上の古いページに対してトランザクションの適用(更新後状態の再現)を行う処理です。したがってロールフォワードに備えるログには「更新後情報(after-image/redo 情報)」が必要になります。これが選択肢の中で正しいのは、エが「ロールフォワードに備えて、更新されたページに対する更新後情報を取得する」と明示しているためです。
同時に実運用のログは、トランザクションの取り消し(ロールバック)用に更新前情報(before-image/undo)も保持するのが一般的で、媒体障害復旧=更新前情報ではなく、媒体障害復旧では主に更新後情報(REDO)が使われる点を押さえてください。
解法ステップ
- 各選択肢が指す「目的(取消し/媒体障害/ロールバック後の再実行/ロールフォワード)」を明確にする。
- 各目的に対してどの種のログ情報(更新前情報=undo / 更新後情報=redo)が必要かを対応させる:
- トランザクション取消し → 更新前情報(undo)
- 媒体障害からの復旧(ディスク不整合の回復)→ 更新後情報(redo)
- ロールフォワード → 更新後情報(redo)
- 選択肢と対応を照合し、更新後情報が必要とするもの(媒体障害復旧・ロールフォワード)を満たす選択肢を選ぶ。結果、エが一致する。
選択肢別の誤答解説
-
ア: 「トランザクションの取消しに備えて更新後情報を取得する」
誤り。トランザクションを取り消す(ロールバックする)際は、行やページを更新する前の値(更新前情報=before-image)を用いて変更を打ち消します。したがって取り消しのために必要なのは更新前情報です。 -
イ: 「媒体障害からの復旧に備えて更新前情報を取得する」
誤り。媒体障害(例えばディスクの故障や古いページの残存)からの復旧は、ディスクに残っている古い状態に対してコミット済みの更新を再適用する(ロールフォワード/REDO)ことが中心です。したがって復旧には更新後情報が必要です。更新前情報はロールバック(UNDO)で使用します。 -
ウ: 「ロールバック後のトランザクション再実行に備えて更新後情報を取得する」
誤りかつ論理が曖昧。ロールバックは未コミットの変更を取り消す操作であり、そのために更新前情報(UNDO)が用いられます。「ロールバック後の再実行(retry)」は通常アプリケーションやミドルウェアが再試行するもので、ログ中の更新後情報が自動的にトランザクション再実行を行うわけではありません。ログは再実行支援(コミット済み変更のREDO)や障害復旧のために更新後情報を保持するが、ロールバック直後の再試行に特化して更新後情報だけを保存する、という説明は誤解を招きます。なお、運用上はログに両方(before/after)を保持することが多いです。 -
エ: 「ロールフォワードに備えて、更新されたページに対する更新後情報を取得する」
正しい。ロールフォワード(REDO)は更新後の値をページに適用して正しいコミット済み状態を再現するため、更新後情報が必須です。よってエが正解です。
よくある誤解
-
「媒体障害=UNDOで直せる」と考える誤り
媒体障害ではディスク上のページが古い状態になっていることが多く、コミット済み更新を再適用(REDO)する必要があります。UNDO(更新前情報)は未コミットの打ち消しに用いるもので、媒体障害復旧の主役はREDOです。 -
「ログにはどちらか一方しか入らない」と思い込むこと
実務ではUNDO用の更新前情報とREDO用の更新後情報の両方をログに記録する方式(例:ARIESスタイル)が多く、両者を組み合わせて一貫性と可用性を確保します。 -
「ロールバック=そのまま再実行される」と考える誤り
ロールバックはあくまで取り消し操作であり、その後の再試行(再実行)はアプリケーションやトランザクション制御の設計による。ログのREDOは自動的にトランザクションを再実行する仕組みではありません。
補足コラム
- WAL(Write-Ahead Logging)ルール:データページより先に対応するログレコードを永続化(ディスクに書き込む)する必要があります。これにより、障害発生時にログを参照してREDO/UNDOが可能になります。
- ARIES(Algorithm for Recovery and Isolation Exploiting Semantics)では、ログに before-image と after-image を適切に残し、チェックポイント、UNDOフェーズ、REDOフェーズを組み合わせて効率的かつ正確な復旧を実現します。
- 代表的なログレコード構造(簡易例):
LSN | TransactionID | PageID | BeforeImage | AfterImage | Type(UPDATE/COMMIT/ABORT)
- チェックポイントはログの適用範囲を限定して復旧時間を短縮します。チェックポイント以降のコミット情報や更新後情報を用いてREDOを行い、未コミットはUNDOで処理します。
FAQ
Q. 未コミットの変更は媒体障害復旧で再適用されますか?
A. いいえ。媒体障害復旧のREDOはコミット済みの変更を再適用します。未コミットの変更はUNDOで取り消す必要があります。
A. いいえ。媒体障害復旧のREDOはコミット済みの変更を再適用します。未コミットの変更はUNDOで取り消す必要があります。
Q. ログに更新前情報だけ、または更新後情報だけを残す設計はあるのですか?
A. 物理ログや論理ログ、DBMS設計によっては片方に重きを置く方式もありますが、一般的・実用的には両方を保持してUNDOとREDOの両機能を確保することが多いです。
A. 物理ログや論理ログ、DBMS設計によっては片方に重きを置く方式もありますが、一般的・実用的には両方を保持してUNDOとREDOの両機能を確保することが多いです。
Q. 「再実行(retry)」は誰が行うのですか?
A. 多くの場合、アプリケーション層やトランザクション処理ミドルウェアが再試行を実装します。ログのREDOはシステム復旧時の適用であり、アプリケーションの再試行とは役割が異なります。
A. 多くの場合、アプリケーション層やトランザクション処理ミドルウェアが再試行を実装します。ログのREDOはシステム復旧時の適用であり、アプリケーションの再試行とは役割が異なります。
関連キーワード: ロールフォワード、ロールバック、UNDO、REDO、WAL、ARIES、LSN、チェックポイント

\ せっかくなら /
データベーススペシャリストを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

