応用情報|ロールバックとロールフォワードの使い分け!DBMSの障害回復のしくみ

※アフィリエイト広告を利用しています。
※アフィリエイト広告を利用しています。
テクノロジ系

「ロールバックとロールフォワードって何が違うの?」

「どっちをどの場面で使うのかわからない・・・」

そんな悩みを解決するべく、ロールバックとロールフォワードの違いと、2つの使い分けを解説していきたいと思います!

DBMSの仕組み

DBMSとは、データベース管理システムとも呼ばれ、データベースを便利に使うための機能や仕組みのことです。その名の通り、「データベースを管理するためのシステム」ということです。

今回は、DBMSの中でも、障害回復に着目します。

データベースの中にデータを書き込むとき、「データベースの中に直接データを書く」と思っていませんか?

「データバッファ」と「データベース」の関係、それからデータバッファを用いるときの障害回復のやり方について、しっかり理解しておきましょう。

データバッファとデータベースの関係

DBMSでは、データを書き込みする際、直接データベースにではなく「バッファ」という場所に書き込みを行います。入出力の効率を上げるためです。

そして、バッファに空きがなくなったなどのタイミングで、バッファに溜めておいた書き込みを、一気にデータベースに書き出します。

そのような仕組みであるため、「バッファにデータは書き込んだが、データベースには書き込まれていない」という状態があり得るのです。

4つの障害回復パターン

例として、このようなトランザクションがあったとします。

① ネットで電子書籍を購入し、電子書籍が読めるようになる
② 銀行口座からお金が引かれる

トランザクションとは、切り離せない複数の処理をセットにしたものです。この2つの処理は、どちらかが完了した状態では意味がありません。「電子書籍が読める状態になっているのに、料金が支払われていない」「電子書籍は読めないのに、お金だけ引かれている」という状態はだめですよね。

ここで、障害が起こるパターンを2つ考えてみましょう。

① 片方の処理だけバッファ上で行い、その後に障害が発生する
② 両方の処理を行いCOMMITした後、障害が発生する

COMMITとは、処理を確定させることです。トランザクション処理は、「複数の処理をすべて完了していないと意味がない」んでしたよね。そのため、すべての処理で足並みをそろえなければなりません。どれか1つの処理が早く終わったからと言って、その結果を確定させてしまうと、うまくいかなかった処理が発生したときに困ってしまいます。

そんなときに使うのが「COMMIT」です。「そっちの準備終わった?終わったら返事して!」というのがCOMMIT要求、それに対して「大丈夫だよ!」「無理っぽい!」のどちらかを返してあげます。大丈夫な場合は、複数の処理でせーの!で「COMMIT」が成立するという仕組みです。

COMMITの説明

障害が起こるパターンの①、②からさらに分岐して、あり得る障害回復パターンは4つです。

A パターン①が起こったとき、データベースに書き出しを行っていない
B パターン①が起こったとき、データベースに書き出しを行った
C パターン②が起こったとき、両方ともデータベースに書き出しを行っていない
D パターン②が起こったとき、両方ともデータベースに書き出しを行った

どの状態で障害が起こったかによって、復旧の方法が変わります。

undo/redo方式ってなに?

システムの再起動では、ログファイルを使って障害回復を行う「undo/redo方式」を行います。これは、「undo」と「redo」の2つの処理から成り立つ方法です。

「undo」は、COMMITが済んでいなかったトランザクションを、更新前の情報を使って書き戻す処理です。システム障害時も処理の真っ最中だった、COMMITが済んでいない中途半端な更新については、ログをたどって最初まで巻き戻していきます。

「redo」は、COMMIT済みだがデータベースには書き出していないトランザクションを、更新後の情報を使って書き進める処理です。データベースには書き出していないので、処理の記録は障害発生時に消えてしまいます。そのため、COMMITしたところまでログを使って書き進めてデータベースを更新します。

チェックポイントリスタートってなに?

undo/redo方式は、最大でシステム起動時からの莫大な量のログが必要だったり、回復にも時間がかかったりします。そのため、定期的にデータバッファの内容をデータベースへと書き出すタイミングを設けます。それが、チェックポイントです。

チェックポイントは定期的に、COMMITとは全く違うタイミングで行います。また、データバッファはチェックポイントで書き出しを行いますが、ログバッファはチェックポイントに加えてCOMMITのタイミングでも書き出しを行います。

ロールバックとロールフォワード

チェックポイントリスタートで用いる処理が、「ロールバック」と「ロールフォワード」です。

ロールバックは、障害発生時からチェックポイントまでさかのぼってログファイルを見ていく処理で、「undo」と同じ操作です。また、チェックポイント前から障害発生時までずっと実行中だったトランザクションは、チェックポイントよりさらにさかのぼって「undo」します。

ロールフォワードは、チェックポイントから時系列順にログファイルを見ていく処理で、「redo」と同じ操作です。

ここで注意なのですが、ロールバックやロールフォワードを行うのは、「データの更新」「データの書き出し」を行う場合のみです。「データの参照」「データの読み出し」などは、ログをさかのぼってデータを再現する必要がないので、ロールバックもロールフォワードも行いません。

まとめ

応用情報では、午前問題でも午後問題でも「障害回復」について問われることがあります。しっかり仕組みの部分から理解して、「ロールバック」と「ロールフォワード」の違いを判別できるようになりましょう!

次のステップへ:応用情報技術者試験合格者の声

合格者の体験​​談と学習のコツ

コメント

タイトルとURLをコピーしました