Published on

July 11, 2013

Понимание страниц дифференциальной карты изменений (DCM) и дифференциальных резервных копий в SQL Server

В наших предыдущих статьях мы обсуждали различные типы страниц в SQL Server, такие как страницы данных, GAM и SGAM, страница PFS и страница IAM. В этой статье мы рассмотрим концепцию страниц дифференциальной карты изменений (DCM) и то, как они используются в дифференциальных резервных копиях.

DCM-страницы используются SQL Server для отслеживания участков, которые были изменены после последней операции полной резервной копии. Эти страницы находятся на 6-й странице в файле данных. Каждая DCM-страница имеет бит для каждого отслеживаемого участка. Если бит установлен в 1, это означает, что соответствующий участок был изменен после последней полной резервной копии. Если бит установлен в 0, это означает, что изменений в соответствующем участке не было.

Одна DCM-страница может отслеживать информацию для примерно 64 000 участков. DCM-страницы повторяются после каждых 511 232 страниц, и каждая DCM-страница может отслеживать изменения для точно 63 904 участков. Это означает, что вторая DCM-страница будет находиться на 511 238-й странице.

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

Давайте рассмотрим пример:

CREATE DATABASE Mydb
GO

BACKUP DATABASE Mydb TO DISK = 'D:\mydb.bak'
GO

DBCC TRACEON (3604)
DBCC PAGE ('MYDB', 1, 6, 3)

Из вывода видно, что четыре участка, начиная с 0-й страницы до 32-й страницы, были изменены после последней полной резервной копии. Важно отметить, что не все 32 страницы обязательно имеют изменения. Однако мы можем заключить, что изменения произошли как минимум на четырех страницах, по одной странице из каждого участка. Эти изменения могут быть вызваны командой полной резервной копии во внутренних таблицах.

Теперь давайте добавим некоторые данные в базу данных и снова рассмотрим DCM-страницу:

SELECT * INTO mydb..SalesOrderDetail FROM AdventureWorks2008.sales.SalesOrderDetail

DBCC PAGE ('MYDB', 1, 6, 3)

Выполнив вышеуказанный код, мы создаем таблицу и вставляем в нее данные, что вызывает изменения во многих системных таблицах. В результате мы видим, что многие участки помечены как измененные после последней полной резервной копии. Изменения до номера страницы 1:176 вызваны изменениями во внутренних объектах, в то время как страницы с 1:176 по 1:1671 изменены из-за вставки данных в таблицу SalesOrderDetail.

При выполнении дифференциальной резервной копии SQL Server читает DCM-страницы и включает страницы, помеченные как измененные, в резервную копию. Например, даже если есть изменения только на четырех страницах в первой записи (1:0 – 1:24), дифференциальная резервная копия будет включать все 32 страницы в резервную копию.

BACKUP DATABASE Mydb TO DISK = 'D:\Mydbdifferential.bak' WITH DIFFERENTIAL

DBCC PAGE ('MYDB', 1, 6, 3)

После дифференциальной резервной копии мы видим, что в DCM-страницах нет изменений, за исключением двух дополнительных участков, которые помечены как измененные. Участки 72-80 и 136-144 ранее были помечены как не измененные, но после дифференциальной резервной копии они помечены как измененные. Это связано с изменениями, вызванными дифференциальной резервной копией во внутренних таблицах. Важно отметить, что дифференциальная резервная копия не очищает DCM-страницу.

Вкратце, дифференциальная резервная копия всегда включает все изменения, которые произошли с момента последней полной резервной копии, а не только изменения с момента последней дифференциальной резервной копии. Размер файла дифференциальной резервной копии можно рассчитать, используя информацию из DCM-страницы. В нашем примере размер файла дифференциальной резервной копии составляет 13 452 КБ, что близко соответствует расчету на основе количества измененных страниц в DCM-странице.

Теперь давайте сделаем полную резервную копию и наблюдаем изменения в DCM-странице:

BACKUP DATABASE Mydb TO DISK = 'D:\MydbFull.bak'

DBCC PAGE ('MYDB', 1, 6, 3)

После полной резервной копии SQL Server очищает DCM-страницу. Все помечено как “Не изменено”, за исключением четырех участков 1:0 – 1:32. Эта резервная копия будет служить базой для всех последующих дифференциальных резервных копий. Если вам нужно сделать полную резервную копию без нарушения существующей цепочки резервных копий, вы можете использовать опцию “WITH COPY_ONLY”:

BACKUP DATABASE Mydb TO DISK = 'D:\MydbFull_Copy.b
Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.