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