SQL Server存儲(7/8) :批量更改映射(Bulk Changed Map:BCM)頁

SQL Server使用BCM頁來跟蹤自上次全備後,被大容量日誌操作修改的區,BCM頁是第7頁。

BCM 對每個跟蹤的頁都有一個位。如果爲1,表示對應區在上次日誌備份後因爲大容量日誌操作而修改。一個BCM頁可以保存近64000個區的信息。BCM頁在每511232頁重複一次。一個BCM頁可以跟蹤63904個區的信息。第2個BCM頁會出現在第511239頁。

BCM頁只有數據庫進行大容量日誌恢復模式時纔會用到。在此模式下,當進行日誌備份時,SQL Server掃描BCM頁,查找在使用事務日誌進行日誌備份時標記爲已經更改的區。這讓SQL Server進行大容量日誌恢復是可回滾的,如果是數據庫是從數據庫備份中還原,並且有一系列的事務日誌備份。在大容量日誌恢復模式裏,大容量日誌操作包括BCP,Bulkinsert, Select Into等在事務日誌裏是最低程度寫入日誌的,並通過BCM頁對修改過的區進行跟蹤。這讓SQL Server 進行大容量操作時有更好的性能。

BCM頁在簡單還原和完整還原模式裏不涉及任何操作。在簡單和完整還原模式裏,大容量日誌操作被當作完全日誌操作。簡單來說,在簡單和完整還原模式裏,BCM頁不會對通過大容量日誌操作產生的改變進行跟蹤。

我們用一個例子來理解下:新建一個空數據庫,修改數據庫還原模式爲大容量日誌恢復模式,將數據庫進行備份,最後用DBCC PAGE來查看BCM頁的信息。

CREATE DATABASE BCMdb
GO
ALTER DATABASE BCMdb SET RECOVERY BULK_LOGGED
BACKUP DATABASE BCMdb TO DISK='D:\BCMdb.bak'
GO
DBCC TRACEON(3604)
DBCC PAGE('BCMdb',1,7,3)

可以清楚看到,沒有看到因大容量日誌操作而造成的分區改變。我們來執行一個大容量日誌操作。

1 SELECT * INTO BCMdb..SalesOrderDetail FROM AdventureWorks2008R2.sales.SalesOrderDetail
2 DBCC TRACEON(3604)
3 DBCC PAGE('BCMdb',1,7,3)

可以看到,有2條被標記爲MIN_LOGGED 。第1條是因爲IAM頁中的改變,第2條是因爲SELECT INTO插入的數據操作。現在當我們進行日誌備份,SQL Server會備份事務日誌,就是BCM頁裏標記爲改變的區對應的事務日誌。日誌備份後,BCM頁的相關區,因大容量日誌操作而打上改變的標記,會打上未改變的標記。我們來進行下日誌備份。

1 BACKUP LOG BCMdb TO DISK='D:\BCMdblog.trn'
2 GO
3 DBCC PAGE('BCMdb',1,7,3)

注意,BCM頁不會因爲完整或差異備份做相應改變。事務日誌備份是剛纔事務日誌的基礎。SQL Server應該知道2個事務日誌之間所發生的改變。如果差異或完整備份清空了BCM頁裏的標記,下個事務日誌備份就不能跟蹤或還原上一個日誌備份和完整或差異備份之間的改變。簡而言之,一個完整或差異備份不會打斷事務日誌備份鏈。

 

參考

http://www.sqlservercentral.com/blogs/practicalsqldba/2013/07/24/sql-server-understanding-bulk-change-map-bcm-page-and-bulk-logged-recovery-model/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章