Поделиться через


Контрольные точки и активная часть журнала

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

  • Накат записанных в журнал изменений, не записанных на диск до остановки системы.

  • Откат всех изменений, связанных с незавершенными транзакциями, такими как транзакции, для которых в журнале нет записи COMMIT или ROLLBACK.

Функционирование контрольной точки

Контрольная точка выполняет в базе данных следующее.

  • Записывает в файл журнала запись, отмечающую начало контрольной точки.

  • Сохраняет данные, записанные для контрольной точки в цепи записей журнала контрольной точки.

    Одним из элементов данных, регистрируемых в записях контрольной точки, является номер LSN первой записи журнала, при отсутствии которой успешный откат в масштабе всей базы данных невозможен. Такой номер LSN называется минимальным номером LSN восстановления (MinLSN). Номер MinLSN является наименьшим значением из:

    • номера LSN начала контрольной точки;

    • номера LSN начала старейшей активной транзакции;

    • номера LSN начала старейшей транзакции репликации, которая еще не была доставлена базе данных распространителя.

    Записи контрольной точки содержат также список активных транзакций, изменивших базу данных.

  • Если база данных использует простую модель восстановления, помечает для повторного использования пространство, предшествующее номеру MinLSN.

  • Записывает все измененные страницы журналов и данных на диск.

  • Записывает в файл журнала запись, отмечающую конец контрольной точки.

  • Записывает в страницу загрузки базы данных номер LSN начала соответствующей цепи.

Действия, приводящие к установке контрольных точек

Контрольные точки устанавливаются в следующих ситуациях.

  • При явном выполнении инструкции CHECKPOINT. Контрольная точка срабатывает в текущей базе данных соединения.

  • При выполнении в базе данных операции с минимальной регистрацией, например при выполнении операции массового копирования для базы данных, на которую распространяется модель восстановления с неполным протоколированием.

  • При добавлении или удалении файлов баз данных с использованием инструкции ALTER DATABASE.

  • При остановке экземпляра SQL Server с помощью инструкции SHUTDOWN или при остановке службы SQL Server (MSSQLSERVER). И в том, и в другом случае будет создана контрольная точка каждой базы данных в экземпляре SQL Server.

  • Если экземпляр SQL Server периодически создает в каждой базе данных автоматические контрольные точки для сокращения времени восстановления базы данных.

  • При создании резервной копии базы данных.

  • При выполнении действия, требующего отключения базы данных. Примерами могут служить присвоение параметру AUTO_CLOSE значения ON и закрытие последнего соединения пользователя с базой данных или изменение параметра базы данных, требующее перезапуска базы данных.

Автоматические контрольные точки

Компонент SQL Server Database Engine создает контрольные точки автоматически. Интервал между автоматическими контрольными точками определяется на основе использованного места в журнале и времени, прошедшего с момента создания последней контрольной точки. Интервал между автоматическими контрольными точками колеблется в широких пределах и может быть довольно длительным, если база данных изменяется редко. При крупномасштабных изменениях данных частота автоматических контрольных точек может быть гораздо выше.

Используйте параметр конфигурации сервера recovery interval для вычисления интервала между автоматическими контрольными точками для всех баз данных на экземпляре сервера. Значение этого параметра определяет максимальное время, отводимое компоненту Database Engine на восстановление базы данных при перезапуске системы. Компонент Database Engine оценивает количество записей журнала, которые он может обработать за время recovery interval при выполнении операции восстановления.

Кроме того, интервал между автоматическими контрольными точками зависит от модели восстановления, как показано ниже.

  • Если применяется полная модель восстановления или модель восстановления с неполным протоколированием, то автоматическая контрольная точка создается каждый раз, когда число записей в журнале достигает значения, определенного Database Engine в качестве предельного количества записей, которое оно может обработать за время, заданное параметром recovery interval.

  • Если используется простая модель восстановления базы данных, автоматическая контрольная точка создается каждый раз, когда число записей в журнале достигает меньшего из двух предельных условий:

    • журнал заполняется на 70 процентов;

    • число записей в журнале достигает значения, определенного компонентом Database Engine в качестве количества записей, которое он может обработать за время, заданное параметром recovery interval.

Сведения об установке интервала восстановления см. в разделе Как установить интервал восстановления (среда SQL Server Management Studio).

Если используется простая модель восстановления базы данных, то при срабатывании автоматических контрольных точек неиспользуемая часть журнала транзакций удаляется. Однако при использовании модели полного восстановления или модели восстановления с неполным протоколированием журнал в результате срабатывания автоматических контрольных точек не усекается. Дополнительные сведения см. в разделе Усечение журнала транзакций.

Инструкция CHECKPOINT теперь поддерживает необязательный аргумент checkpoint_duration, определяющий время (в секундах), отводимое контрольным точкам на завершение. Дополнительные сведения см. в разделе CHECKPOINT (Transact-SQL).

Активный журнал

Часть журнала, начинающаяся с номера MinLSN и заканчивающаяся последней записью, называется активной частью журнала, или активным журналом. Этот раздел журнала необходим для выполнения полного восстановления базы данных. Ни одна часть активного журнала не может быть усечена. Все записи журнала до номера MinLSN должны быть удалены из частей журнала.

На следующем рисунке изображена упрощенная схема журнала завершения транзакций, содержащего две активные транзакции. Записи контрольных точек были сжаты в одну запись.

Журнал завершения с активными транзакциями

Последней записью в журнале транзакций является запись с номером LSN, равным 148. На момент обработки записанной контрольной точки с номером LSN 147 транзакция 1 уже зафиксирована и единственной активной транзакцией является транзакция 2. В результате первая запись журнала, созданная для транзакции 2, становится старейшей записью активной транзакции на момент последней контрольной точки. Таким образом, номером MinLSN становится номер LSN, равный 142 и соответствующий записи начала транзакции 2.

Длительные транзакции

Активный журнал должен включать в себя все элементы всех незафиксированных транзакций. Приложение, инициирующее транзакцию и не выполняющее ее фиксацию или откат, не позволяет компоненту Database Engine повышать MinLSN. Это может привести к проблемам двух типов.

  • Если система будет выключена после того, как транзакцией было выполнено много незафиксированных изменений, этап восстановления при последующем перезапуске может занять гораздо больше времени, чем указано параметром recovery interval.

  • Журнал может достичь очень большого объема, потому что после номера MinLSN усечь его нельзя. Это справедливо даже в том случае, если используется простая модель восстановления, когда журнал транзакций обычно усекается при каждой автоматической контрольной точке.

Транзакции репликации

Агент чтения журнала следит за журналом транзакций всех баз данных, на которых настроена репликация транзакций, и копирует отмеченные для репликации транзакции из журнала транзакций в базу данных распространителя. Активный журнал должен содержать все транзакции, отмеченные для репликации, но еще не доставленные базе данных распространителя. Если эти транзакции не реплицировать в допустимый срок, усечение журнала может оказаться невозможным. Дополнительные сведения см. в разделе Как работает репликация транзакций.