基礎

停電で全部消えた (永続性)

定義

永続性 (durability) とは、コミット済みトランザクションによる変更がシステム障害の発生後も失われずに保持される性質であり、多くの DBMS では変更操作のログを永続ストレージへ先行して同期書き込みする Write-Ahead Logging (WAL) によって実現される。

事故 — 停電で 8 時間分の作業が消えた

終業間際、スタッフは Excel を保存し忘れたまま画面を開きっぱなしにして退勤した。 深夜 2 時、雷雨で停電。翌朝出勤して Excel を開くと、当日の受注データがまるごと消えていた。最終保存は朝 9 時。以降 17 時までの 8 時間分の作業が全滅。 自動回復ファイルにも 15 時までの断片しか残っていなかった。

原因 — Excel は明示保存後にしか確定しない

Excel の「変更」はメモリ上にしかない。Ctrl+S を押した瞬間、あるいは自動保存機能が発火した瞬間にしかディスクに書かれない。電源が落ちるとメモリの内容は消える。自動回復は数分単位の抜けを救うが確実ではない。

Excel の作業履歴 — 明示保存の間だけが揮発
  1. OPExcel を開く / 保存済み状態
  2. OP9:00 手動で保存 (最終保存)
  3. OP9:00〜17:00 受注入力 (メモリ上のみ)
    8 時間分の作業が「メモリ」にしか無い状態
  4. EVENT深夜 2 時 停電
    メモリ内容は全て消える
結末
8 時間分の作業が消失 (最終保存以降が全滅)
先に用語を整理
  • WAL (Write-Ahead Logging): データ本体ファイルより 先に「変更ログ」をディスクに書き込む方式
  • REDO ログ: コミット済みだがデータ本体に反映が間に合わなかった変更を、 クラッシュ後に 再現 するための操作記録
  • UNDO ログ: 未コミットの変更を 取り消す ための操作記録
  • ロールフォワード (roll forward): REDO ログを再生して、 コミット済みの状態まで前に進める処理
  • ロールバック (roll back): UNDO ログを使って、 未コミット変更を取り消す処理 (原子性の実装にも使う)
  • クラッシュリカバリ: DBMS 起動時にログを読み、 ロールフォワード + ロールバックで整合性を復元する処理

解決策 — WAL とコミット時の同期書き込み

RDB の COMMIT「ログを永続ストレージに書き終わってから」アプリケーションに成功を返す。データ本体ファイルより先に、変更操作をログに記録する ことで、ログが確実にディスクに残っていれば後から状態を再現できる。これが WAL の原理。

COMMIT の裏では、OS のバッファではなく 物理ディスクへの書き込み完了まで DBMS が待つ (「同期書き込み」)。これで COMMIT 応答が返った時点で、 変更は電源喪失があっても失われない状態になっている。

RDB の COMMIT + WAL — COMMIT 応答時点で確定
  1. BEGINBEGIN
  2. OPINSERT / UPDATE / ...
  3. COMMITCOMMIT (同期書き込み待ち)
    WAL エントリが物理ディスクに書き終わった状態。この瞬間から永続化保証
  4. EVENT停電
    データ本体ファイルの一部がまだメモリでも問題ない
  5. OP復電 → ロールフォワードでコミット済み状態を復元
結末
COMMIT 済みの変更は全て守られる (WAL による再現可能性)

クラッシュリカバリ — ロールフォワード + ロールバック

DBMS 起動時に クラッシュリカバリ フェーズを実行する:

  1. ロールフォワード: REDO ログを再生し、コミット済みだがデータファイルに 反映が間に合っていなかった変更を再適用する
  2. ロールバック: UNDO ログを使って、未コミットのまま中断した変更を取り消す

この 2 段階で「COMMIT 応答済みの変更は残り、未 COMMIT の変更は消える」が保証される。

境界事例

  • 同期書き込みを無効化する高速化オプション: PostgreSQL のsynchronous_commit = off など。スループットは上がるが、電源喪失で数百 ms 分の コミットが失われる可能性がある。データが消えても再生できる用途 (キャッシュ、ログ収集) 以外では使わない
  • グループコミット / ログのバッファリング: 複数トランザクションの WAL を まとめて 1 回で書き込む。スループットを稼ぎつつ永続性は保つ最適化
  • レプリケーションと永続性: 同期レプリケーションを組めば primary クラッシュ時も レプリカで復旧可能。非同期だとレプリカに届かなかった数百 ms 分が失われる (RPO)
  • 民生 SSD の電源保護: エンタープライズ SSD は電源保護コンデンサ内蔵、 民生 SSD は多くの場合内蔵していない。RDB サーバのストレージ選定で確認事項

よくある疑問

Q.WAL とデータファイルの書き込み順序はなぜ WAL が先?
A.WAL を先に永続化することで、クラッシュ後にログを再生 (ロールフォワード) すれば必ずコミット済み状態に戻せます。データファイルを先に書くと、書き込み途中で落ちた時に整合性を保証できません。
Q.同期書き込みを無効化するとどうなる?
A.スループットは上がりますが、OS やディスクのバッファに残った WAL がクラッシュで失われる可能性があり、コミット済みのはずの変更が消える (永続性が破れる) リスクがあります。データが消えても再生できる用途 (キャッシュ、ログ収集) 以外では使わないのが安全。
Q.レプリケーションがあれば WAL は要らない?
A.非同期レプリケーションだと primary クラッシュ時にレプリカに届いていない変更が失われます。同期レプリケーションでも WAL は障害復旧の基盤として必要です。
Q.SSD ならデータが壊れにくいから同期書き込みは不要では?
A.SSD 内部にも DRAM キャッシュがあり、電源喪失で書き込み途中の状態が中途半端に残る可能性があります。エンタープライズ SSD は電源保護回路を持ちますが、一般的な民生 SSD には無いことが多いです。

もっと学びたい方へ(おすすめ書籍)

おすすめ
達人に学ぶDB設計徹底指南書 第2版
ミック

テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。

Amazon で見る →
[改訂3版]内部構造から学ぶPostgreSQL
勝俣智成 ほか

PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。

Amazon で見る →
情報処理教科書 データベーススペシャリスト 2025年版
三好康之

IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。

Amazon で見る →
おすすめ
楽々ERDレッスン (CodeZine BOOKS)
羽生章洋

ER 図をどう「使える設計」に落とすか、実務の判断まで踏み込んだ入門書。エンティティの切り出しから多対多の扱いまで具体例が豊富。

Amazon で見る →
達人に学ぶSQL徹底指南書 第2版
ミック

SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。

Amazon で見る →
SQLアンチパターン 第2版
Bill Karwin

実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。

Amazon で見る →
理論から学ぶデータベース実践入門
奥野幹也

リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。

Amazon で見る →

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →
  • 教え方も上手で、お人柄も良いメンターです。DB周りの知識はもちろん、何より、しっかり教えてあげようという姿勢がとてもありがたかったです。データベース、SQLの学習を考えている方にはおススメです。
    H 様DB・SQL コース受講
  • 体系的に知識を教えてくださり、実際の業務でも大変役立っております。特に短い時間で効率よく知識の習得や、練習をできているのは期待以上でした。
    M 様DB・SQL コース受講
  • 大変充実したコンテンツでわかりやすいご説明をありがとうございました。基本的な質問にも丁寧にご説明いただき、また業務のご相談にも乗って頂き大変有意義な時間でした。
    K 様DB・SQL コース受講