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