3.10.25

Какая часть журнала транзакций попадает в FULL BACKUP

Автор: Paul Randal, More on how much transaction log a full backup includes

В одной из статей я развенчал миф о том, какой объём журнала транзакций включает полная резервная копия. В комментариях мне задали вопрос (передаю по смыслу):

Полная резервная копия должна включать весь журнал транзакций от begin LSN самой старой активной транзакции на момент завершения части резервного копирования, читающей данные, и до LSN, на котором эта часть чтения данных заканчивается. Если этот begin LSN по времени позже LSN контрольной точки, которую резервное копирование делает в самом начале, то зачем полной резервной копии включать весь журнал транзакций между контрольной точкой и begin LSN? Для чего он нужен?

Я ответил шуткой, что проще объяснить это на доске с временной шкалой, — и с энтузиазмом сделал картинку в PowerPoint, чтобы показать нагляднее.


   [1] контрольная точка резервного копирования
         [2] резервная копия читает страницу X
--|-----|----|----|----|----|----|-----------------------------------------
[3] начинается транзакция A [4] транзакция A изменяет страницу X
[5] начинается самая старая активная транзакция B
[6] транзакция A завершается [7] завершается чтение данных резервной
                                        копией

Рассмотрим временную шкалу на рисунке выше для полной резервной копии (красные номера соответствуют пунктам ниже):

  1. Операция резервного копирования выполняет контрольную точку, чтобы сбросить на диск все «грязные» страницы из буферного пула — как содержащие изменения уже зафиксированных транзакций, так и те, что содержат изменения ещё выполняющихся транзакций. Затем операция резервного копирования начинает чтение выделенных страниц базы данных.
  2. Операция чтения считывает страницу X.
  3. Начинается транзакция A.
  4. Транзакция A вносит изменение в страницу X. Копия этой страницы в резервной копии теперь устарела. Обратите внимание: резервное копирование не станет перечитывать страницу X — оно уже прошло этот участок базы данных.
  5. Начинается транзакция B. Она не завершится до окончания операции чтения данных, поэтому её begin LSN станет begin LSN самой старой активной транзакции.
  6. Транзакция A фиксируется. Это фиксирует изменения страницы X.
  7. Часть резервного копирования, читающая данные, завершается, и начинается чтение журнала транзакций.

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

Если бы в резервную копию включался журнал только начиная с begin LSN самой старой активной транзакции (пункт 5), то восстановленная из резервной копии копия страницы X (прочитанная на шаге 2) не была бы обновлена изменениями из транзакции A (которые произошли на шаге 4). Это означало бы, что она не будет транзакционно согласована с остальной базой данных на момент завершения чтения данных (пункт 7).

Итак, (если не учитывать репликацию) минимальный LSN журнала транзакций, который попадает в полную резервную копию, равен MIN (LSN последней контрольной точки, LSN самой старой активной транзакции). Это гарантирует, что при восстановлении можно выполнить REDO записей журнала, чтобы «довести» страницы до актуального состояния, и UNDO — для транзакций, которые к тому моменту не были зафиксированы.


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

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