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