障害発生後にログの更新前情報を使って未完了の処理を取り消す回復処理。
ロールバックリカバリ(後退復旧)とは、障害が起きたとき、ログ(=更新の記録)に残った「更新前の値」を使って、まだ完了していない処理を取り消す回復方法のことです。トランザクション(=ひとまとまりの処理)が中途半端なまま止まってしまうと、データのつじつまが合わなくなります。そこで「やりかけは無かったことにする」のが基本の考え方です。
身近な例で考えると、下書き中の文書をうっかり閉じてしまったとき、保存前の編集を破棄して元の状態に戻すのに似ています。書きかけの内容(未完了の処理)は捨て、確定して保存した内容(コミット済みの処理)だけを残すイメージです。
上のツールで▶ボタンを押すと、障害発生から未完了のT2を見つけ出し、更新前の値で口座Aを巻き戻して整合性を取り戻す流れを順に確認できます。
後退復旧は、ログを手がかりに「取り消すべき処理」を見つけて元に戻すという流れで進みます。具体的な手順は次のとおりです。
・① ログを読み返す:障害直前までのログを後ろから順にたどる
・② 未完了を特定:BEGINはあるのにCOMMITが無いトランザクションを「未完了」と判定する
・③ 更新前情報で取り消す:ログに残った「更新前の値」を使い、データを処理前の状態へ書き戻す(=アンドゥ)
・④ コミット済みは保持:確定した処理はそのまま残し、巻き戻さない
ポイントは、更新「前」の値を使うという点です。ログには更新前と更新後の両方が記録されていますが、取り消すときに必要なのは「変える前はいくつだったか」という情報です。上のツールのログファイル表示で、強調された行が手がかりになっている様子を確認してみてください。
ログを使った復旧には2つの向きがあります。ロールバック(後退復旧)は「時間を戻す」方向、ロールフォワード(前進復旧)は「時間を進める」方向です。どちらを使うかは、対象の処理がコミット済みかどうかで決まります。
| 項目 | ロールバック | ロールフォワード |
|---|---|---|
| 別名 | 後退復旧 | 前進復旧 |
| 使う情報 | 更新前情報 | 更新後情報 |
| 対象 | 未完了(コミット前) | コミット済み |
| 動き | 処理を取り消す | 処理を再現する |
覚えかたとしては、「未完了は取り消す(後退)、コミット済みは取り戻す(前進)」と整理すると分かりやすいです。バックアップから復元したあと、その後にコミットされた処理を更新後情報で再現するのがロールフォワード、逆に途中で止まった処理を更新前情報で消すのがロールバック、という対の関係になっています。