- ベストアンサー
障害回復(ロールバックとロールフォワード)について
t0 t1 t2 t3 t4 t5 | | A s---e | | | | B s-------------e | | | C s------------------------| | | D | s----e | | | E | s---------| ※t2はチェックポイント、t5は障害発生 ロールバックとロールフォワードについて教えてください。 (1)BとEについてロールフォワードによる回復が必要とのことですが、障害発生前にトランザクションが終了しており、コミットされているはずなのに、なぜロールフォワードが必要なのでしょうか? (2)Aはチェックポイント前に処理が完了しているため、回復処理は不要とのことですが、BとEが必要でAが不要の違いわかりません。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
障害回復における、チェックポイントとログの位置づけをちゃんと理解しておくことが必要です。 表現は、少々乱暴ですが・・・ まず、データベースは、障害回復のために、総てのデータベース操作に関して、詳細なログを保持します。(このログさえあれば、全操作のやり直しも取消も可能なだけの情報を保持します。障害回復の他にもいろいろな用途に使われるシステムの心臓部に近いです。もちろん、最重要ファイルですので、物理ファイルへの記録も最優先で行われ、さらに、壊れた時のことを考えて複数ファイルにコピーしておくこともあります。ある意味、データベース本体の物理ファイルより重要なファイルです。データ本体なんて、このログさえあればいつでも作り直せますから。) さて、操作のコミットとはなんでしょうか?実は、コミットすることにより、データベースが保証するのは、単に、「データを確定状態とし、ログを完全な形で確定しまた。」というだけのことなんです。データベースの状態としては、もしかすると、単にメモリー上にあるキャッシュデータを書き換えただけで、実際の物理ファイルへの記録は遅延されているかもしれません。 でも、チェックポイントは違います。総てのデータが最終的な物理ファイルに正しい形で保存されることを保証します。同時に、ログに関しても完全な状態であることを保証します。よって、この時点が、障害回復における起点になります。(障害が起こったと言うことは、物理ファイルがすべてのよりどころです。メモリー上のキャッシュなんて当然吹っ飛んでるのが前提ですから。ちなみに、データベースの物理ファイルのバックアップはチェックポイントの強制的な発生がセットです。でないと、物理ファイルがデータベースの正しい状態を保持している保証が持てないからです。) 総ての障害回復は、この時点のデータベースの状態を原点として行います。 各、トランザクションに関して、詳しく見てみましょう。 総ての前提として、障害が発生した後、回復処理を行うわけですが、データベースは、最初に直近のチェックポイントまで巻き戻されます。これは、中途半端なデータが物理ファイルに残っている可能性が捨てきれないからです。メモリーキャッシュの中身はもうこの時点では解りませんからね。 まず、A。これは、チェックポイント以前にコミット処理まで総て終了しています。従って、物理ファイルに完全な結果が反映されているので、何ら処理の必要はありません。 次に、B。チェックポイント時点では、コミットが完了していなかったと仮定します。(線のずれが微妙で、どっちか判別できないんですが、この図を書いた人としては順番からして、多分そのつもりだったろうと想像します。)データベースは、チェックポイントまで巻き戻されました。でも、ログは残っています。ですから、チェックポイント後のログのデータを元に、この部分の操作をやり直します。この操作をロールフォーワードと呼びます。 次に、C。これは、障害時点でコミットされていません。従って、このトランザクションは、ロールバックを指示されたと解釈するべきです。(障害後に何をするつもりだったかはRDBMSは知りませんからね。コミットする気だったかロールバックする気だったかも解りません。解らないことがあるなら悲観的に物事を考えるのがトランザクションの仕事です。)でも、データベース物理ファイルはチェックポイント時に確定してしまいました。ですから、ログを元に、チェックポイントからさかのぼって操作を取り消します。(逆操作を行うわけです。)これが障害回復におけるロールバックです。この後、このトランザクションに関しては、トランザクションを再実行する必要があります。 次に、D。これは、チェックポイント後にスタートし、障害前にコミットが完了しています。データベースはチェックポイント時点まで巻き戻されていますから、全部の操作のやり直しです。ログは完全に残ってますから、ログを元にロールフォーワードします。 最後にE。チェックポイント後にスタートし、障害時点でコミットされていません。コミットしていませんから、これもロールバックすべきです。でも、データベースはチェックポイントまで巻き戻されています。ということは・・・そう。なんにもする必要はありません。当然、この後、このトランザクションは、再実行する必要があります。(このEは、図の読み方が少し自信ありません。というのは、あなたは、障害前にコミットされていると書いておられるのですが、eマークが図にないように見えるので・・・書き忘れか、文章がミスかどちらか解らないんです。) 以上です。図が、ずれているので、多分そうだろうと言うように読みました。もし、タイミングの読みが間違っているようなら、上の話を基本に考えてみてください。 ちなみに、実際のシステムが、実際に物理ファイルを巻き戻すかを含めて、実装方法は様々です。あくまで考え方と言うことで。
その他の回答 (1)
- Kazma_hk
- ベストアンサー率26% (115/428)
ロールバックとロールフォワードの違いですね。 ロールバックはトランザクションが完了する前に障害が起きた場合にトランザクション開始時点に戻すこと。 ロールフォワードは、チェックポイント時点に戻すことです。 チェックポイントとはいわゆるセーブポイントです。 セーブポイントまで戻るということはそのほかのデータに関してもチェックポイント時点まで戻ってしまいます。 Aはチェックポイントt2時点でデータが確定しているためロールフォワードの意味がありません。t5からt2に戻っても変化がないためです。 B,Eに関しては、t2時点で変更はないですが、t2からt5までの間にデータの変更があるため、t2時点まで戻さないと他のデータとの整合性がなくなってしまうため必要となります。
お礼
Kazma_hkさん ご回答ありがとうございます。 ロールバック、ロールフォワード、それぞれの具体的な役割のイメージがやっと頭の中でできました。 ありがとうございました。
お礼
mitonekoさん、早速のご回答ありがとうございます。 > 次に、B。チェックポイント時点では、コミットが完了していなかったと仮定します。(線のずれが微妙で、どっちか判別できないんですが、この図を書いた人としては順番からして、多分そのつもりだったろうと想像します。) ずれて見えていましたか。すみません。私のPCではちゃんと見えてたので。申し訳ないです。その通りです。 >Eは、図の読み方が少し自信ありません。というのは、あなたは、障害前にコミットされていると書いておられるのですが、eマークが図にないように見えるので・・・書き忘れか、文章がミスかどちらか解らないんです。) 重ねがさねすみません。文章のミスです。 「BとEについて・・」と書いていますが、「BとDについて・・」が正しいです。 非常にわかりやすい解説をありがとうございます。 コミット直前のログの書き出しと、チェックポイントとの役割についてようやく理解できました。 ここが理解できてなかったので、図のそれぞれのパターンでの対応の違いが理解できませんでした。ありがとうございました。