忍者ブログ
データベースエンジニアのための実践ブログ。Oracle・PostgreSQL・MySQLなどの環境構築、実行計画の読み方やチューニングといった現場で役立つノウハウ、DB基礎知識までを発信しています。

【データベースの基礎】データ損失を防ぐ生命線!「ログ先行書き込み(WAL / コミットログ)」の仕組みと役割

データベースシステムにおいて、障害が発生してもデータを安全に復旧(リカバリー)できるのはなぜだろうか。
その中心にあるメカニズムが「ログ先行書き込み(WAL: Write-Ahead Logging)」(あるいはコミットログ)である。

今回は、ログ先行書き込みの基本的な概念から、その必要性、内部の仕組み、代表的な採用製品、そしてメリット・デメリットまでをわかりやすく整理した。


1. ログ先行書き込み(WAL)とは?基本概念

データベースでは、パフォーマンスを向上させるために、変更されたデータ(更新内容)をまず高速なメモリ(バッファ)上で処理し、実際のストレージ(ディスク)への書き込みは後回し(遅延書き込み)にしている。

しかし、ディスクに書き込まれる前にサーバーの電源が落ちたり障害が発生したりすると、メモリ上のデータは消えてしまう。
これを防ぐため、「データ本体をディスクに書き込む前に、変更履歴(ログ)を必ず安全なストレージに順次書き込んでおく」という仕組みがWALである。


2. なぜWALが必要なのか?(仕組みと目的)

データベースの信頼性を保つ上で、WALには主に2つの重要な目的がある。

  • ① クラッシュリカバリー(障害からの復旧)
    突然のサーバーダウン時、ディスク上のデータファイルは中途半端な状態になっている可能性がある。このときWAL(変更ログ)を参照し、未完了の処理をロールバックしたり、完了していてディスクに反映されていなかった処理を再適用(リドゥ)することで、データを一貫性のある正しい状態に戻す。
  • ② トランザクションの耐久性(Durability)保証
    ACID特性の「D(Durability)」を担保する。アプリケーションが「コミット(保存)」を要求した際、重いデータファイルを直接ディスクに書き込むのではなく、軽量なログ領域へ確実に書き終えた時点で「保存完了」と応答できるため、高速かつ安全な処理が可能になる。

3. どんな製品で採用されている?(Oracleとの違い)

「WAL」という名称や概念は、多くのオープンソースデータベースや分散データベースで標準的に採用されている。

  • ・PostgreSQL: そのまま「WAL(Write-Ahead Log)」と呼ばれる仕組みで実装されており、アーキテクチャの根幹をなしている。
  • ・SQLite: 「WALモード」を有効にすることで、並行処理性能と安全性を飛躍的に向上させることができる。
  • ・MySQL (InnoDB): 「Redoログ(Redo Log)」と呼ばれる仕組みを採用しており、概念としてはWALと同等である。

Oracle Databaseの場合は?

質問にもある通り、Oracle Databaseでは「WAL」という用語は一般的に使われない。代わりに、同様の目的を持つ仕組みとして「Redoログ(Redo Log / Redoログファイル)」や、変更ベクトルを管理する「LGWR(ログライター)プロセス」が稼働している。用語やアーキテクチャの表現は異なるが、「変更を先にログへ書き込んでからデータファイルを更新する」という根本的な思想は同一である。


4. WALのメリット・デメリット

メリット
  • 書き込みパフォーマンスの向上: ランダムアクセスとなる重いデータファイルの更新を遅延させ、シーケンシャルにログへ追記することでI/Oを高速化できる。
  • 高い信頼性と復旧力: 突然の電源断やクラッシュがあっても、ログから正確にデータを復元できる。
  • レプリケーションへの応用: ログをそのままスタンバイサーバーへ転送・適用することで、手軽に高可用性(HA)構成や読み取り専用レプリカを構築できる。
デメリット・注意点
  • ストレージ容量の圧迫: 更新が頻繁なシステムではログが急速に肥大化するため、適切なローテーションや定期的なバックアップ(アーカイブ)が不可欠。
  • I/Oボトルネックの懸念: コミットのたびにログの物理的なディスク書き込み(フラッシュ)を待つため、ストレージの書き込み性能(特にIOPSやレイテンシ)が全体の性能を大きく左右する。

5. まとめ

ログ先行書き込み(WAL / Redoログ)は、データベースの「スピード」と「安全性」を両立させるための最も重要なアーキテクチャである。
普段何気なく発行している COMMIT の裏側では、このログへの書き込みが確実に行われることで、私たちのデータが守られている。

【エンジニアの押さえどころ】
✔ データ本体の書き込みよりも「ログへの書き込み」が先に行われる(これがWALの名前の由来)。
✔ PostgreSQLなどのOSSでは「WAL」、Oracleでは「Redoログ」と呼ばれるが、果たす役割は同じ。
✔ トランザクション性能や障害復旧をチューニングする際は、ログ出力先ストレージのパフォーマンスが鍵となる。
PR