Перейти к содержанию

WAL, redo/undo и crash recovery

Механизмы · Системы

Тип материала: архитектурный разбор. Схемы и примеры иллюстративные, если не указано иное.

Версии в источниках: PostgreSQL 17, MySQL 8.4, Oracle 19c, Cassandra 5.0, Redis 7.4 и ClickHouse 25.8 либо явно названный сервис.

Механизм

Write-ahead означает: нужные log records устойчиво записываются до соответствующих data pages. Redo повторяет изменения после crash; undo поддерживает откат/старые версии там, где реализация его использует. PostgreSQL не имеет такой же undo segment модели, как Oracle/InnoDB.

flowchart LR
  Mutation --> Log[Append log record]
  Log --> Flush[Durable log flush]
  Flush --> Ack[Commit acknowledgement]
  Flush --> Pages[Data pages later]
  Log --> Replay[Crash redo and visibility recovery]

Операция чтения или записи по шагам

Transaction меняет buffer page и создаёт log records → WAL/redo flush по commit policy → ACK → dirty page flush позже. Crash между ACK и data flush восстанавливается redo при корректной durability. PG незакоммиченные tuples не видимы по transaction status; Oracle/InnoDB используют свои undo/recovery процедуры.

Консистентность, отказ и восстановление

Checkpoint ограничивает объём recovery, но не отменяет backup/WAL retention для PITR. Torn pages требуют конкретной защиты: PostgreSQL full-page writes/checksums и InnoDB doublewrite имеют разные роли. Checksums обнаруживают часть повреждений, не восстанавливают потерянные данные сами.

Выбор, эксплуатация и ограничения

Group commit амортизирует fsync; asynchronous commit снижает ожидание ценой возможной потери acknowledged transactions. Отключение fsync может угрожать целостности шире последней операции. Логи должны помещаться на disk с headroom; CDC slot retention способен остановить primary.

Типичные ошибки проектирования

Называть binlog, redo, Kafka log и event store взаимозаменяемыми. Вопрос: почему durable ACK не равен external exactly-once? У внешней системы свой commit boundary, а потерянный ACK допускает retry.

Вопросы на собеседовании

Как доказать применимость механизма? Назвать invariant, scope, isolation/acknowledgement boundary, версию, допустимые interleavings и процедуру восстановления. Один успешный запрос или статическая диаграмма этого не доказывают.

Практические упражнения

Для каждого момента crash укажите, какие data/log pages могли сохраниться и какой outcome увидит client. Затем спроектируйте restore с одной отсутствующей WAL segment.

Дополнительные источники

Политика версий и проверки. Статическая проверка статьи не является runtime/fault verification механизма.