障害回復
なぜデータベースに障害回復が必要なのか
Section titled “なぜデータベースに障害回復が必要なのか”データベースは、企業の業務において欠かせない存在です。銀行の口座残高、通販サイトの注文情報、病院の患者データなど、日々膨大なデータが読み書きされています。
しかし、コンピュータは万能ではありません。停電やハードディスクの故障、ソフトウェアの不具合などにより、データベースの処理が途中で止まってしまうことがあります。もし障害が起きたときにデータが壊れたまま放置されると、銀行口座の残高がおかしくなったり、注文した商品が届かなかったりといった深刻な問題が発生します。
こうしたトラブルに備え、データベースには障害回復(リカバリ)の仕組みが用意されています。障害が発生しても、データを正しい状態に戻せるようにすることが、データベース管理システム(DBMS)の重要な役割の一つです。
ログ(更新履歴)
Section titled “ログ(更新履歴)”障害回復を行うためには、「データベースがいつ、どのように変更されたか」を記録しておく必要があります。この記録をログ(ジャーナルとも呼ばれます)といいます。
ログとは、データベースの更新履歴を記録したファイルのことです。データベースに対して行われた変更内容が、時系列に沿ってすべて記録されます。具体的には、「どのデータを」「変更前はどんな値だったか」「変更後はどんな値になったか」といった情報が含まれます。
たとえば、銀行の口座Aから口座Bへ1万円を振り込む処理では、ログには次のような情報が記録されます。
- 口座Aの残高:10万円 → 9万円に変更
- 口座Bの残高:5万円 → 6万円に変更
このログがあるからこそ、障害が発生したときに「何が起きていたか」をたどり、データを正しい状態に回復できるのです。
試験で出るポイント
「ログとは何か」を問う問題が出題されています(2024年出題)。「データベースの更新履歴を記録したファイル」という定義を正確に覚えましょう。コミットや排他制御、ロールバックの定義と入れ替えた選択肢に注意してください。
コミットとロールバック
Section titled “コミットとロールバック”データベースの処理はトランザクションという単位で行われます。トランザクションとは、「一連の処理をひとまとまりとして扱う仕組み」のことです。たとえば「口座Aからお金を引く」と「口座Bにお金を足す」は、2つ合わせて1つのトランザクションです。
トランザクションの結果は、コミットかロールバックのどちらかで終了します。この2つは対になる概念です。
コミットとは、トランザクションの処理がすべて正常に完了したとき、データベースへの更新内容を確定する操作です。コミットが行われると、変更内容が正式にデータベースに反映され、他の処理からも参照できるようになります。
ロールバックとは、トランザクションの処理中にエラーが発生した場合に、データベースをトランザクション開始前の状態に戻す操作です。たとえば、口座Aからお金を引いた直後にエラーが起きた場合、口座Aの残高を元に戻して、まるで何も起きなかったかのようにします。
| 操作 | 意味 | 実行されるとき |
|---|---|---|
| コミット | 更新を確定する | トランザクションが正常に完了したとき |
| ロールバック | 更新を取り消し、処理前の状態に戻す | トランザクションの途中でエラーが発生したとき |
つまり、「成功したら確定(コミット)、失敗したら元に戻す(ロールバック)」というのが、トランザクション処理の基本的な考え方です。
試験で出るポイント
コミットとロールバックの定義は頻出です(2021年、2023年、2025年に出題)。「コミット=確定」「ロールバック=取り消し」をセットで覚えましょう。排他制御(ロック)やログの定義と入れ替えた選択肢が出るため、それぞれの違いを正確に区別することが大切です。
チェックポイント
Section titled “チェックポイント”データベースへの変更は、処理速度を上げるために、まずメモリ上で行われます。メモリ上のデータは高速にアクセスできますが、電源が切れると消えてしまうという弱点があります。そのため、定期的にメモリ上のデータをハードディスクなどの記憶装置に書き出す必要があります。
チェックポイントとは、DBMSが定期的にメモリ上の更新内容をデータベース(ディスク)に書き出し、ログと同期をとるタイミングのことです。
チェックポイントを設けることで、障害回復の際に「どこまでの処理がディスクに確実に反映されているか」が明確になります。回復作業はチェックポイントの時点を基準に行えばよいため、ログをすべて最初からたどり直す必要がなく、回復時間を短縮できます。
graph LR
CP["チェックポイント"]:::primary --- Fail["× 障害発生"]:::alert
subgraph TxA["Tx A:回復不要"]
A1(["開始 → コミット済"]):::base
end
subgraph TxB["Tx B:ロールフォワード対象"]
B1(["開始 → コミット済"]):::primary
end
subgraph TxC["Tx C:ロールバック対象"]
C1(["開始 → 未完了 ×"]):::alert
end
A1 -.-|"CP前に完了"| CP
B1 -.-|"CP後にコミット"| Fail
C1 -.-|"障害時に未完了"| Fail
classDef base fill:#f8fafc,stroke:#94a3b8,stroke-width:1px,color:#333;
classDef primary fill:#eff6ff,stroke:#2563eb,stroke-width:2px,color:#1e40af;
classDef alert fill:#fef2f2,stroke:#dc2626,stroke-width:2px,color:#991b1b;
バックワードリカバリ(ロールバック)
Section titled “バックワードリカバリ(ロールバック)”障害回復の方法は大きく2種類あります。その一つがバックワードリカバリ(ロールバック)です。
バックワードリカバリとは、ログに記録された更新履歴を使って、データベースを処理前の状態に「後退」させる回復方法です。名前の「バックワード(後ろへ)」が示すとおり、時間を巻き戻すイメージです。
たとえば、トランザクションの途中で障害が発生し、コミットされていない中途半端な変更がデータベースに残っている場合に使われます。ログをさかのぼり、変更前の値に書き戻すことで、トランザクション開始前の正しい状態に戻します。
バックワードリカバリが使われる場面は、主に次のようなケースです。
- トランザクションの処理中にエラーが発生した
- ソフトウェアの不具合で処理が異常終了した
- デッドロック(複数のトランザクションが互いにロックを待ち合う状態)の解消
フォワードリカバリ(ロールフォワード)
Section titled “フォワードリカバリ(ロールフォワード)”もう一つの障害回復方法がフォワードリカバリ(ロールフォワード)です。
フォワードリカバリとは、バックアップデータとログを使って、障害発生直前の状態までデータベースを「前進」させて復旧する回復方法です。名前の「フォワード(前へ)」が示すとおり、過去の時点から現在に向かってデータを復元するイメージです。
たとえば、ハードディスクが故障してデータベース全体が失われたとします。この場合、まず事前に取得しておいたバックアップからデータベースを復元します。しかし、バックアップは障害発生よりも前の時点のデータなので、バックアップ以降に行われた処理の内容が反映されていません。そこで、ログに記録されている更新履歴を順番に再適用(再実行)することで、障害が起きる直前の状態まで復旧させます。
フォワードリカバリが使われる場面は、主に次のようなケースです。
- ハードディスクの物理的な故障
- データベースファイルの破損
- 災害などによるデータ消失
ロールバックとロールフォワードの対比
Section titled “ロールバックとロールフォワードの対比”2つの回復方法は混同しやすいため、違いを整理しておきましょう。
| 項目 | バックワードリカバリ(ロールバック) | フォワードリカバリ(ロールフォワード) |
|---|---|---|
| 方向 | 後退(処理前に戻す) | 前進(障害直前まで進める) |
| 使うもの | ログ(変更前の値) | バックアップ+ログ(変更後の値) |
| おもな用途 | 未完了のトランザクションを取り消す | ディスク障害などでデータが失われたときに復旧する |
| 復旧先の状態 | トランザクション開始前 | 障害発生直前 |
| 覚え方 | 「巻き戻し」 | 「早送り」 |
覚え方のコツとして、「ロールバック=後退=巻き戻し」「ロールフォワード=前進=早送り」とイメージすると、2つの違いを区別しやすくなります。
試験で出るポイント
ロールバックとロールフォワードの違いは、使うものと復旧の方向で区別しましょう。「ログだけで元に戻す」のがロールバック、「バックアップ+ログで障害直前まで復旧する」のがロールフォワードです。また、コミット・ロールバック・排他制御・ログの4つの用語は定義を入れ替えた選択肢が頻出なので、それぞれの定義を正確に区別できるようにしておきましょう。
過去問で実力チェック
Section titled “過去問で実力チェック”過去問に挑戦
Q. 金融システムの口座振替では,振替元の口座からの出金処理と振替先の口座への入金処理について,両方の処理が実行されるか,両方とも実行されないかのどちらかであることを保証することによってデータベースの整合性を保っている。データベースに対するこのような一連の処理をトランザクションとして扱い,矛盾なく処理が完了したときに,データベースの更新内容を確定することを何というか。
- ア コミット
- イ スキーマ
- ウ ロールフォワード
- エ ロック
解答(令和3年)
正解: ア
Q. トランザクション処理におけるコミットの説明として,適切なものはどれか。
- ア あるトランザクションが共有データを更新しようとしたとき,そのデータに対する他のトランザクションからの更新を禁止すること
- イ トランザクションが正常に処理されたときに,データベースへの更新を確定させること
- ウ 何らかの理由で,トランザクションが正常に処理されなかったときに,データベースをトランザクション開始前の状態にすること
- エ 複数の表を,互いに関係付ける列をキーとして,一つの表にすること
解答(令和5年)
正解: イ
Q. トランザクション処理に関する記述のうち,適切なものはどれか。
- ア コミットとは,トランザクションが正常に処理されなかったときに,データベースをトランザクション開始前の状態に戻すことである。
- イ 排他制御とは,トランザクションが正常に処理されたときに,データベースの内容を確定させることである。
- ウ ロールバックとは,複数のトランザクションが同時に同一データを更新しようとしたときに,データの矛盾が起きないようにすることである。
- エ ログとは,データベースの更新履歴を記録したファイルのことである。
解答(令和6年)
正解: エ
Q. DBMSのトランザクションに関する記述として,適切なものはどれか。
- ア あるデータベースの内容を他のデータベースに複製し,内容の同期をとる。
- イ データベースに対して行った操作を,順次記録する。
- ウ データベースに対する一連の処理が全て成功したら変更結果を確定し,途中で失敗したら処理前の状態に戻す。
- エ データベースの表の索引を作成し,検索時には索引を使用する。
解答(令和7年)
正解: ウ