Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Postgres: wal, durability, crash

Что происходит в базе данных при записи с точки зрения журналирования (WAL)?

Вопрос проверяет понимание механизма журналирования и того, как базы данных обеспечивают сохранность данных при сбоях.

Короткий ответ

При записи база данных сначала фиксирует изменения в журнале WAL, а затем применяет их к таблицам. Это гарантирует, что изменения можно восстановить после сбоя. Подтверждение транзакции происходит после записи WAL. Такой подход обеспечивает надежность данных.

Длинный ответ

Журналирование через WAL — это ключевой механизм, который обеспечивает надежность и восстановление базы данных после сбоев.

Определение:
WAL (Write-Ahead Logging) — это механизм, при котором изменения сначала записываются в журнал, а уже потом применяются к основным данным.

Почему сначала пишется журнал

Основная идея:

  1. Запись в журнал выполняется последовательно, что быстро для диска.

  2. Восстановление после сбоя проще — достаточно «проиграть» журнал.

Это дешевле и надежнее, чем сразу изменять множество страниц таблиц.

Что происходит при записи

Когда выполняется INSERT или UPDATE, процесс обычно выглядит так:

  1. Транзакция формирует изменения.

  2. Генерируется запись WAL.

  3. Запись WAL помещается в буфер.

  4. При commit WAL сбрасывается на диск.

  5. Транзакция считается подтвержденной.

  6. Изменения в таблицах могут быть записаны позже (checkpoint или background writer).

Важно понимать, что подтверждение транзакции связано именно с WAL, а не с физической записью страниц таблицы.

Что происходит при сбое

Если сервер падает:

  1. После запуска база читает WAL.

  2. Применяет все подтвержденные изменения.

  3. Незавершенные транзакции откатываются.

Это называется crash recovery.

Почему это может быть дорого

Журналирование требует:

  1. Дополнительных операций записи.

  2. fsync для гарантии сохранности.

  3. Управления буферами и checkpoint.

При высокой нагрузке WAL может стать узким местом.

Как WAL используется в репликации

Во многих системах:

  1. WAL передается на реплики.

  2. Реплики применяют те же изменения.

Это основа streaming replication.

Практические моменты, которые важно понимать

На производительность влияют:

  1. Частота commit.

  2. Настройки synchronous commit.

  3. Размер checkpoint.

  4. Скорость диска для WAL.

Частые мелкие транзакции могут быть значительно дороже батчевых.

Вывод

WAL обеспечивает надежность и восстановление базы данных: сначала изменения фиксируются в журнале, затем применяются к данным. Это увеличивает стоимость записи, но делает систему устойчивой к сбоям.

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    5

  • Сложность:

    7

Навыки

  • Postgres

    Postgres

Ключевые слова

#wal

#durability

#crash

Подпишись на Golang Developer в телеграм

  • Аватар

    Golang Guru

    Maxim Lukyanov

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.