8
Контрольная точка
Периодический сброс всех грязных буферов на диск
гарантирует попадание на диск всех изменений до контрольной точки
ограничивает размер журнала, необходимого для восстановления
Восстановление при сбое
начинается с последней контрольной точки
последовательно проигрываются записи, если изменений нет на диске
xid
контрольная точка
контрольная точка сбой
необходимые файлы журнала
начало
восстановления
Когда сервер PostgreSQL запускается после сбоя, он входит в режим
восстановления. Информация на диске в это время несогласованна:
изменения «горячих» страниц пропали, поскольку эти страницы все
еще находились в кеше, а более поздние изменения уже были
сброшены на диск.
Чтобы восстановить согласованность, PostgreSQL читает WAL и после-
довательно проигрывает каждую его запись, если соответствующее
изменение не попало на диск. Таким образом восстанавливается
работа всех транзакций. Транзакции, запись о фиксации которых не
успела попасть в журнал, считаются оборванными.
Однако объем журнала за время работы сервера мог бы достигнуть
гигантских размеров. Хранить его целиком и просматривать при сбое
совершенно не реально. Поэтому СУБД периодически выполняет
контрольную точку (КТ): принудительно сбрасывает на диск все грязные
буферы (включая буферы clog, хранящие состояние транзакций).
Собственно «точка» — это момент начала записи буферов, которые
были грязными на этот момент. Но точка считается выполненной только
после того, как все такие буферы записаны. Это гарантирует, что все
изменения, сделанные до момента КТ, находятся на диске.
В реальных системах с большим буферным кешем КТ может
сбрасывать много грязных буферов, поэтому сервер распределяет
процесс записи по времени, чтобы сгладить нагрузку на ввод-вывод.
Восстановление после сбоя начинается с момента последней
завершенной КТ, что позволяет хранить только файлы журнала,
записанные после нее.