26.12.25

Любопытный случай… немедленной записи и минимально логируемых операций

Автор: Paul Randal, The Curious Case of… eager writing and minimally-logged operations

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

Оказывается, это не так.

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

  • Для каждого экстента, изменённого минимально логируемой операцией, устанавливается бит в битовой карте (которая называется либо «битовая карта минимального логирования», либо «карта массовых изменений», либо BCM). Одна такая битовая страница отслеживает подобные экстенты для каждых 4 ГБ каждого файла данных.
  • Следующая резервная копия журнала, созданная после завершения минимально логируемой операции, сохраняет весь журнал, затем сканирует битовые карты минимального логирования и считывает все экстенты, отмеченные как изменённые.
  • После этого битовые карты минимального логирования сбрасываются.

Примечание: Можно было бы предположить, что существует состояние гонки между параллельным созданием резервной копии журнала и выполнением минимально логируемой операции, но это невозможно, так как эти две операции являются взаимоисключающими (то есть минимально логируемая операция не может начаться во время создания резервной копии журнала, и наоборот). Это обеспечивается с помощью блокировки подресурса на уровне базы данных, которая отображается в выводе sys.dm_tran_locks как 'BULKOP_BACKUP_LOG', аналогично блокировке подресурса hobt BULK_OPERATION, о которой я писал здесь.

Итак, вернёмся к исходному вопросу. Если контрольная точка не происходит после минимально логируемой операции и до следующего резервного копирования журнала, что-то должно гарантировать, что страницы, изменённые этой операцией, уже находятся на диске. Это обеспечивается с помощью так называемой немедленной записи (eager writing). Прежде чем минимально логируемая операция сможет быть зафиксирована, все изменённые ею страницы должны быть устойчиво сохранены в файлах данных на диске. Немедленная запись обеспечивает это, записывая страницы на диск по мере их заполнения в ходе минимально логируемой операции, не дожидаясь контрольной точки. Таким образом, когда минимально логируемая операция фиксируется, она полностью устойчиво сохранена на диске в файлах данных и в журнале.

И это происходит не только для обеспечения корректности резервных копий журнала; это также необходимо для гарантии правильной работы восстановления после аварийного завершения.

Суть: Существует три способа, которыми изменённая (так называемая «грязная») страница файла данных может быть записана на диск: контрольная точка (CHECKPOINT), с помощью фонового процесса записи (lazy writer) или посредством немедленной записи (eager writing).



Комментариев нет:

Отправить комментарий