データベースの復旧
障害時のトランザクションの状態により、
復旧の手順は異なる。
あるトランザクションについて、
コミット後には
正常にログ情報が保存されている。
チェックポイントでは、その時点での
ログ情報とデータベースの内容とを
完全に記録する。
障害復旧とは、直前の成功したチェックポイントを起点として、
障害が起こらなかった場合と同じ状態に戻す作業である。
以下、上図のA〜Eの各トランザクションについて、
障害復旧の方法を説明する。
まず、データベースの状態をチェックポイント時点に戻したところから
考えることにする。
- A:チェックポイント前に終了しているトランザクション
チェックポイントに正常に処理が終了した結果が残っているので、
もう何もする必要はない。
- B:ログが正常に残っているトランザクション(チェックポイント前に開始)
チェックポイント時点の状態から、残っている正常なログに従って
修正を加えていけば、障害時点の状態に復旧可能である。
これをロールフォワードと言う。
- C:ログが残っていないトランザクション(チェックポイント前に開始)
チェックポイント後のログが残っていないので、チェックポイント時点の状態と、
その時点までに残っているCのログを逆方向に辿(たど)っていき、
トランザクションCが実行される前の状態にデータベースを一旦もどす。
これをロールバックと言う。
その後、トランザクションCを再実行すればよい。
- D:ログが正常に残っているトランザクション(チェックポイント後に開始)
チェックポイント状態とログを使用すれば、障害時点の状態に復旧できる。
従って、ロールフォワードを行う。
再実行でも同じことだが、ログを用いた方が処理効率がよい場合もある。
- E:ログが残っていないトランザクション(チェックポイント後に開始)
チェックポイント時点ではD同様、トランザクションEによる影響は記録されて
いないのだから、単に再実行すればよい。(Dと違ってログが残っていないので、
ロールフォワードは出来ない。)