В одной из статей я развенчал миф о том, какой объём журнала транзакций включает полная резервная копия. В комментариях мне задали вопрос (передаю по смыслу):
Полная резервная копия должна включать весь журнал транзакций от begin LSN самой старой активной транзакции на момент завершения части резервного копирования, читающей данные, и до LSN, на котором эта часть чтения данных заканчивается. Если этот begin LSN по времени позже LSN контрольной точки, которую резервное копирование делает в самом начале, то зачем полной резервной копии включать весь журнал транзакций между контрольной точкой и begin LSN? Для чего он нужен?
Я ответил шуткой, что проще объяснить это на доске с временной шкалой, — и с энтузиазмом сделал картинку в PowerPoint, чтобы показать нагляднее.
↓ [1] контрольная точка резервного копирования ↓ [2] резервная копия читает страницу X
--|-----|----|----|----|----|----|-----------------------------------------
↑ [3] начинается транзакция A
↑ [4] транзакция A изменяет страницу X
↑ [5] начинается самая старая активная транзакция B
↑ [6] транзакция A завершается
↑ [7] завершается чтение данных резервной копией
Рассмотрим временную шкалу на рисунке выше для полной резервной копии (красные номера соответствуют пунктам ниже):
- Операция резервного копирования выполняет контрольную точку, чтобы сбросить на диск все «грязные» страницы из буферного пула — как содержащие изменения уже зафиксированных транзакций, так и те, что содержат изменения ещё выполняющихся транзакций. Затем операция резервного копирования начинает чтение выделенных страниц базы данных.
- Операция чтения считывает страницу X.
- Начинается транзакция A.
- Транзакция A вносит изменение в страницу X. Копия этой страницы в резервной копии теперь устарела. Обратите внимание: резервное копирование не станет перечитывать страницу X — оно уже прошло этот участок базы данных.
- Начинается транзакция B. Она не завершится до окончания операции чтения данных, поэтому её begin LSN станет begin LSN самой старой активной транзакции.
- Транзакция A фиксируется. Это фиксирует изменения страницы X.
- Часть резервного копирования, читающая данные, завершается, и начинается чтение журнала транзакций.
Теперь — зачем читается журнал транзакций: чтобы при восстановлении можно было привести базу данных к транзакционно согласованному состоянию на тот момент времени, когда завершилось чтение данных.
Если бы в резервную копию включался журнал только начиная с begin LSN самой старой активной транзакции (пункт 5), то восстановленная из резервной копии копия страницы X (прочитанная на шаге 2) не была бы обновлена изменениями из транзакции A (которые произошли на шаге 4). Это означало бы, что она не будет транзакционно согласована с остальной базой данных на момент завершения чтения данных (пункт 7).
Итак, (если не учитывать репликацию) минимальный LSN журнала транзакций, который попадает в полную резервную копию, равен MIN (LSN последней контрольной точки, LSN самой старой активной транзакции). Это гарантирует, что при восстановлении можно выполнить REDO записей журнала, чтобы «довести» страницы до актуального состояния, и UNDO — для транзакций, которые к тому моменту не были зафиксированы.

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