Wiki
DevOps

WAL (Write-Ahead Log) — что это простыми словами

WAL — журнал изменений БД, куда пишутся сначала операции, потом уже сами данные. Основа crash-recovery, репликации и point-in-time restore в Postgres, MySQL и других.

Write-Ahead Log (WAL) — фундаментальный механизм современных СУБД: любая операция изменения (INSERT / UPDATE / DELETE / DDL) сначала записывается в специальный лог-файл на диске, и только потом применяется к основному хранилищу таблиц. Если процесс БД упал до применения — при рестарте WAL проигрывается заново и данные восстанавливаются без потери.

В Postgres WAL лежит в `pg_wal/` (до v10 назывался `pg_xlog`), сегментами по 16 МБ. `wal_level`, `max_wal_size`, `checkpoint_timeout` — параметры настройки. В MySQL/InnoDB тот же механизм называется redo log (`ib_logfile*`).

Практическое значение: (1) crash-safety — коммит транзакции считается успешным, когда WAL синхронно записан на диск (`fsync`), не когда данные разложены по таблицам. (2) репликация — стриминг WAL на реплику даёт синхронную/асинхронную копию БД. (3) PITR (Point-In-Time Recovery) — можно восстановить БД на любую секунду в прошлом, применив архивированный WAL поверх базового бэкапа.

Опасно: (1) диск для WAL заполняется — БД останавливает запись до освобождения. (2) `synchronous_commit = off` даёт скорость, но потеряете последние секунды данных при сбое. (3) не архивируете WAL — теряете возможность PITR, остаётся только nightly-бэкап.

Частые вопросы

Можно ли выключить WAL?
Нет. Без WAL БД потеряет данные при любом kill -9 или потере питания. Можно только настроить синхронность fsync (`synchronous_commit`).
Как понять, сколько WAL генерируется в секунду?
В Postgres: `SELECT pg_current_wal_lsn();` дважды с интервалом, посчитать разницу в байтах.