Журнал опережающей записи (WAL)

28.2. Журнал опережающей записи (WAL)

Журнал опережающей записи (WAL) — это стандартный метод для уверенности в целостности данных. Детальное описание может быть найдено в большинстве (если не всех) книгах об обработке транзакций. Вкратце, главная идея WAL состоит в том, чтобы изменение файлов данных (где находятся таблицы и индексы) должно осуществляться только после того, как эти изменения были занесены в журнал и только после того как этот журнал был физически записан на диск. Если следовать этой процедуре, нет необходимости сбрасывать страницы с данным на диск при завершении каждой транзакции, потому что мы знаем: если произойдёт сбой, мы сможем восстановить базу данных, используя журнал: любые изменения которые были применены к страницам данных могут быть осуществлены снова по записям в журнале. (Это называется REDO - roll-forward восстановление).

Tip: Поскольку WAL восстанавливает содержимое файлов баз данных после краха, наличие журналируемых файловых систем недостаточно для надёжного хранения файлов с данными или WAL файлов. Фактически, журналирование может снизить производительность, особенно, если журналирование принуждает к сбрасыванию данных на диск. К счастью, сброс данных при журналировании часто можно просто запретить в настройках монтирования файловой системы, например data=writeback в файловой системе ext3 в Linux. Журналируемые файловые системы улучшают скорость загрузки после краха (за счёт отката журнала, вместо проверки целостности всей файловой системы -- прим.пер.)

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

WAL также делает возможны поддержку on-line резервного копирования ("налету") и восстановления на определённый момент времени как описывается в Section 24.3. Архивируя данные WAL, можно поддерживать возврат на любой момент времени, в пределах доступных в WAL данных: мы просто устанавливаем предыдущую физическую копию базы данных и запускаем повтор операций по WAL до нужного нам времени. Более того, нам не нужна физическая резервная копия, чтобы получить мгновенный снимок состояния базы данных — если он необходим на некоторый период времени, то повтор операций по WAL на этот период исправит любые внутренние несоответствия.

Back to top

(С) Виктор Вислобоков, 2008-2023