8
Неатомарность записи
Образ страницы
при сбое страница может быть записана не полностью
в журнал записывается образ страницы
при первом ее изменении после контрольной точки
при восстановлении журнальные записи
применяются к записанному образу
Настройки
full_page_writes = on
wal_compression = off
увеличивает
размер журнала
В-третьих, есть проблема атомарности записи.
Страница данных занимает 8 КБ (или больше: 16 КБ, 32 КБ), а на
низком уровне запись происходит блоками, которые обычно имеют
меньший размер (512 байт, 4 КБ, хотя бывают и другие размеры).
Поэтому при сбое питания страница данных может записаться
частично. Понятно, что при восстановлении бессмысленно применять
к такой странице обычные журнальные записи.
Для защиты PostgreSQL позволяет записывать в журнал образ всей
страницы при первом ее изменении после контрольной точки — этим
управляет параметр full_page_writes. Отключать его имеет смысл,
только если используемая файловая система и аппаратура сами по
себе гарантируют атомарность записи.
Если при восстановлении мы встречаем в журнале образ страницы,
то безусловно записываем его на диск (к нему больше доверия, так как
он, как и всякая журнальная запись, защищен контрольной суммой).
И далее к нему уже применяем обычные журнальные записи.
Хотя PostgreSQL исключает из полного образа страницы незанятое
место, все же объем журнальных записей увеличивается. Если
в кластере включены контрольные суммы страниц, при изменении
битов-подсказок в журнале появляется дополнительная запись,
отражающая изменение контрольной суммы.
Размер журнала можно уменьшить за счет сжатия полных образов,
задав метод сжатия параметром wal_compression. Поддерживаются
методы pglz, lz4, zstd. Значение on соответствует выбору pglz, off
отключает сжатие.