29.3. Запись журнала предварительного чтения (WAL)#
29.3. Запись журнала предварительного чтения (WAL)
Журнал предварительной записи (Write-ahead log) (WAL) является стандартным методом обеспечения целостности данных. Подробное описание можно найти в большинстве (если не во всех) книгах по обработке транзакций. Кратко, главная идея WAL заключается в том, что изменения в файлы данных (где находятся таблицы и индексы) должны быть записаны только после того, как эти изменения были зарегистрированы, то есть после того, как записи журнала, описывающие изменения, были записаны на постоянное хранилище. Если мы следуем этой процедуре, нам не нужно сбрасывать страницы данных на диск при каждом коммите транзакции, потому что мы знаем, что в случае сбоя мы сможем восстановить базу данных, используя журнал: любые изменения, которые не были применены к страницам данных, могут быть повторно выполнены на основе записей журнала. (Это восстановление прокруткой вперед, также известное как REDO).
Подсказка
Поскольку WAL восстанавливает содержимое файлов базы данных после сбоя, журналируемые файловые системы не являются необходимыми для надежного хранения файлов данных или файлов журнала предзаписи. Фактически, издержки на ведение журнала могут снизить производительность, особенно если ведение журнала приводит к сбросу данных файловой системы на диск. К счастью, сброс данных во время журналирования часто можно отключить с помощью опции монтирования файловой системы, например, data=writeback
в файловой системе Linux ext3. Журналируемые файловые системы действительно улучшают скорость загрузки после сбоя.
Использование WAL приводит к значительному сокращению количества записей на диск, поскольку для гарантии коммита транзакции требуется сбросить на диск только журнальный файл, а не каждый измененный транзакцией файл данных. Журнальный файл записывается последовательно, поэтому стоимость синхронизации журнала намного меньше стоимости сброса страниц данных. Это особенно верно для серверов, обрабатывающих множество маленьких транзакций, затрагивающих разные части хранилища данных. Кроме того, когда сервер обрабатывает множество маленьких параллельных транзакций, одно fsync
журнального файла может быть достаточно для коммита множества транзакций.
WAL также позволяет поддерживать резервное копирование и восстановление до точки во времени, как описано в Раздел 25.3. Архивируя данные WAL, можно восстановить базу данных до любого момента времени, охваченного доступными данными WAL: мы просто устанавливаем предыдущее физическое резервное копирование базы данных и воспроизводим журнал WAL только до нужного момента времени. Более того, физическое резервное копирование не обязательно должно быть мгновенным снимком состояния базы данных - если оно выполняется в течение некоторого периода времени, то воспроизведение журнала WAL за этот период исправит любые внутренние несоответствия.