OracleのREDOログファイルの役割



Oracleはコミットしてもデータファイルへ書込みをしないのはなぜ?

Oracleは「コミット」することにより更新を確定しますが、コミットしてもすぐにはデータファイル(.dbf)へ書き込みはしません。

ちなみに、データファイル(.dbf)とはデータそのものが入った物理ファイルです。データファイルへ書き込みするのはチェックポイントが発生したときです。

  • コミット ・・・メモリからREDOログファイルへ更新履歴を書き込む
  • チェックポイント ・・・メモリからデータファイルへ更新データを書き込む

コミットした「更新データ」がすぐに「データファイル」に書き込まない・・・

違和感ありませんか?

「コミットした確定データ」は「データファイル」とイコールでは?もしコミットしたのにデータファイルに書き込まれる前に障害が発生したら「更新データ」が消えてしまうのでは?

という疑問がわきます。

OracleのREDOログファイル

Oracleではデータを保障するためのもう一つのファイルがあります。

それがREDOログファイル(.log)です。REDOログファイルはデータベースの「更新履歴」のファイルで、これにより復旧できるというカラクリです。

具体的にみていきます。

まず、コミットするとREDOログバッファからREROログファイルへ「更新履歴」を書き込みます。

この後、チェックポイントが発生すれば、データファイルに「更新データ」が書き込まれますが、その前に障害が発生して「更新データ」が書き込まれなかったとします。

「更新データ」が消えてしまいました。どうしましょう?

クラッシュリカバリでREDOログファイルを使う

このケースでは、Oracleはクラッシュリカバリという機能で復旧します。クラッシュリカバリとは何でしょうか?

まず、Oracleは起動時にREDOログファイルとデータファイルを比較します。先ほどの「更新データ」は「データファイル」にはありません。でもREDOログファイルには更新したという「更新履歴」があります。

Oracleは「データファイルに更新データがない」を検出し、自動的にREDOログファイルの「更新履歴」から「更新データ」をデータファイルに書き込んで整合性をとってから起動します。

このようにして自動的に失ったデータを復旧します。これをクラッシュリカバリといいます。

コミットした「更新データ」はデータファイルになくてもREDOログファイルに「更新履歴」があります。だからコミットしたデータがデータファイルになくても大丈夫なのです。

この「REDOログファイル(.log)をもとにデータファイル(.dbf)を作る」という仕組みはOracleの重要な動きの1つです。

参照:REDOログの管理 – Oracle Database管理者ガイド

以上、OracleのREDOログファイルの役割でした。