Что такое WAL (Write-Ahead Log) и как он используется для восстановления БД после сбоев?

Ответ

Write-Ahead Log (WAL) — это стандартный механизм для обеспечения атомарности и долговечности (буквы 'A' и 'D' в ACID) в базах данных. Его суть в том, что все изменения сначала записываются в специальный журнал (лог-файл) и только после этого — в основные файлы данных.

Как WAL работает при восстановлении после сбоя:

Когда база данных запускается после сбоя (например, отключения питания), она выполняет процедуру восстановления, используя WAL:


  1. Накатывание (Redo): БД просматривает WAL с последней контрольной точки (checkpoint) и применяет все зафиксированные (committed) транзакции, которые могли не успеть записаться в основные файлы данных. Это обеспечивает долговечность.



  2. Откат (Undo/Rollback): После этого БД ищет в логе транзакции, которые были начаты, но не имеют записи о COMMIT. Все изменения, сделанные этими незавершенными транзакциями, отменяются. Это обеспечивает атомарность.


Пример сценария:

Представим транзакцию перевода денег:

BEGIN;
-- 1. Запись в WAL: списать 100 у id=1
UPDATE accounts SET balance = balance - 100 WHERE id = 1;

-- 2. Запись в WAL: начислить 100 id=2
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- !!! В ЭТОТ МОМЕНТ ПРОИСХОДИТ СБОЙ ПИТАНИЯ !!!

COMMIT; -- Эта запись не попадает в WAL

При восстановлении:

  • База данных увидит в WAL записи об UPDATE для этой транзакции.
  • Однако она не найдет запись о COMMIT.
  • Система сделает вывод, что транзакция не была завершена, и откатит оба изменения (UPDATE). Баланс счетов останется в исходном, согласованном состоянии.