# クラッシュリカバリ
## 定義
クラッシュリカバリ(crash recovery)とは、データベースシステムがクラッシュ・電源断・ノード障害から回復し、コミット済みトランザクションの変更が確実に反映され、未コミットのトランザクションの変更が反映されない一貫性のある状態に復元するプロセスである。トランザクションの ACID 特性のうち「耐久性(Durability)」を、障害が発生した場合にも保証するための仕組みが復旧サブシステムである。(Source: [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]])
**復旧の基本要件**:
- クラッシュ前にコミットしたトランザクションの変更はすべてデータベースに反映される
- クラッシュ時に実行中だった未コミットのトランザクションの変更は反映されない
**復旧の起点**:
- **WAL + チェックポイント方式**: ディスク上の最新チェックポイントから、WAL のログエントリを再適用(Redo)し、必要であれば未コミット変更を取り消す(Undo)
- **コマンドロギング方式**: トランザクション整合性のあるスナップショット(チェックポイント)から、コマンドログに記録されたトランザクションを順番に再実行する
## 横断的知見
- **メインメモリ OLTP では復旧時間よりスループットが優先される**: Malviya+ 2014([[@2014__ICDE__Rethinking Main Memory OLTP Recovery]])は、コマンドロギングの復旧時間が生理ロギングより 1.5×〜5× 遅いことを示したが、本番 OLTP はレプリケーションにより単一ノード障害をマスクできるため、復旧速度よりも実行時スループットの方が重要であると結論した。障害は週 1 回以下の頻度であるという議論も論文に示されている。(Source: [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]])
- **インデックス再構築はスナップショット復元と並行化できる**: VoltDB ではディスクスナップショットにインデックスを含まないため、復旧時にインデックスを再構築する必要がある。コマンドロギング・生理ロギングともに、インデックス再構築はスナップショット復元と並行して実行できる。(Source: [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]])
- **生理ロギングの Redo フェーズは高度に並列化可能**: 異なるパーティションのログレコードは任意の順序で再適用できるため、コア数に比例してリニアスケールアップを達成する。コマンドロギングの再実行は直列(グローバル順序を守る必要がある)であり、並列化に制約がある。(Source: [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]])
- **LLM 訓練チェックポイントとの類比**: データベースクラッシュリカバリは「スナップショット + ログ再適用」の構造を持ち、LLM 訓練の「チェックポイント + 勾配ステップの再実行」と同型の設計である。ただし意味論(commit/abort vs 最終損失収束)が異なる。(Source: [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]], [[@2024__NSDI__MegaScale - Scaling Large Language Model Training to More Than 10,000 GPUs]])
## 未解決の問い
- メインメモリデータベースにおいて、レプリケーション(高可用性)とコマンドロギング(耐久性)の組み合わせで、単一ノード障害と全ノード障害(電源断等)それぞれに対してどの程度のデータロスウィンドウが生じるか?
- コマンドロギングの復旧時間はトランザクション再実行速度に依存するが、復旧速度と実行時スループットのトレードオフはグループコミット間隔のチューニングでどの程度調整可能か?
- スナップショット頻度(180 秒固定)を動的に調整した場合、障害からの復旧時間分布はどう変化するか?
## 関連
- [[Write-Ahead Logging (WAL)]] — 復旧の基本手法
- [[ARIES]] — 生理ロギングに基づく復旧アルゴリズム
- [[コマンドロギング]] — 軽量な代替復旧手法
- [[チェックポイント]] — 復旧の出発点
- [[メインメモリデータベース]] — 復旧設計が特に重要な環境
- [[フォールトトレランス]] — より広い障害許容の文脈
## 出典
- [[@2014__ICDE__Rethinking Main Memory OLTP Recovery]](コマンドロギングと生理ロギングの復旧時間比較)