障害回復とは
障害回復とは、データベース管理システム(DBMS)において、システム障害や停電などによってデータが破損したり、処理が途中で中断したりした際に、データを障害直前の正しい状態に戻す仕組みのことです。データベースは常に多くのデータを更新しているため、突然のトラブルによってデータに矛盾が生じることがあります。これを防ぐために、あらかじめ「ログ(履歴)」を記録しておき、それを使ってデータを復旧します。
障害回復の主な手法には「ロールバック」と「ロールフォワード」があります。ロールバックは、途中で失敗した処理をすべて取り消して実行前の状態に戻すことです。ロールフォワードは、ハードウェアの故障などでデータが壊れた際、バックアップデータと「ジャーナル(更新履歴)」を使って、障害が発生する直前の状態までデータを再現することです。また、定期的にデータの状態を確定させる「チェックポイント」というタイミングを記録しておくことで、回復作業を高速化します。
具体例
例えば、銀行の口座振込の処理中に、停電でシステムが停止したとします。
- ロールバックの例:Aさんの口座から1万円を引き落とした直後に停電が起きた場合、振込先のBさんの口座に1万円が入金される前の状態です。システム復旧時に「途中で失敗した処理」と判断され、Aさんの口座に1万円を戻して取引前の状態へ回復させます。
- ロールフォワードの例:データベースの入ったハードディスク自体が物理的に壊れた場合、前日のバックアップデータを復元し、その後に記録されたジャーナル(ログ)を適用して、故障する直前の最新状態までデータを復旧させます。
もう少し詳しく
障害回復は、データベースのデータがどのような状況にあっても保護されるという、ACID特性における「原子性(Atomicity)」と「耐久性(Durability)」を保証するための中心的技術です。障害回復を正しく行うためには、データベースへの変更内容を記録した「ログ(またはジャーナル)」の運用ルールが極めて重要です。
一般的に、データベース管理システム(DBMS)は「WAL(Write-Ahead Logging:ログ先行書き込み)」という原則に従って動作します。これは、実際のデータベース本体ファイルを書き換える前に、必ずその変更内容を示すログを先にハードディスクなどの不揮発性ストレージに保存する仕組みです。これにより、データ本体の更新途中でシステムがクラッシュしても、残されたログを頼りに確実にデータを復旧することができます。
また、システム障害(メモリ内のデータが消えるが、ディスクは無事な状態)と、メディア障害(ディスク自体が物理的に破損する状態)では回復の手順が全く異なります。システム障害時には、ディスクに残されたログを利用して回復を行います。具体的には、障害発生時にまだ処理中だったトランザクションの変更を「ロールバック」して取り消し、すでにコミット(確定)していたがメモリからディスクへ書き出されていなかったトランザクションを「ロールフォワード」によって再実行します。一方、メディア障害時には、バックアップファイルからデータを復元した上で、バックアップ取得以降のすべての確定済みトランザクションのログを適用する「ロールフォワード」のみを実施して復旧させます。
試験でのポイント
基本情報技術者試験等の試験対策では、システム障害時の回復処理において、どのトランザクションに対してロールバックを適用し、どれに対してロールフォワードを適用するのかを判別する問題が非常によく出題されます。問題用紙には「チェックポイント(確定点)」の線が引かれた時間軸の図が示され、各トランザクションの開始と終了のタイミングが表されます。
判別のコツはシンプルです。「障害発生時点でコミットされていない(未完了の)トランザクションはロールバック」し、「チェックポイント以降にコミットされ、障害発生時に完了していたトランザクションはロールフォワード」します。なお、チェックポイント以前にすでに完了していたトランザクションは、その時点でディスクへの書き出しが確定しているため、回復処理は不要(何もしない)となります。このルールを正確に記憶しておくことが得点に直結します。また、メディア障害時の復旧に必要なファイルとして「バックアップ」と「ログ(ジャーナル)」を選択させる知識問題も頻出です。
関連する用語
障害回復に関連する概念としては、処理を確定する「コミット」、処理を未実行状態に戻す「ロールバック」、ログを用いて処理を再現する「ロールフォワード」、ログの別名である「ジャーナルファイル」、データの一貫性を保証する「ACID特性」などがあります。これらを体系的に整理して覚えることが大切です。