今天我們來討論下批量更改映射(Bulk Changed Map:BCM)頁,還有大容量日志恢復模式(bulk logged recovery model)如何運作的。
批量更改映射(Bulk Changed Map:BCM):SQL Server使用BCM頁來跟蹤自上次完全備份后,被大容量日志操作修改的區。在數據庫文件里,BCM頁是第7頁。BCM對每個跟蹤的頁都有一個位。如果這個位標記是1,表示對應區在上次日志備份后因為大容量日志操作而修改。如果這個位標記為0,表示在上次日子備份后因為大容量日志操作而未被修改。一個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頁的信息。
1 CREATE DATABASE BCMdb2 GO3 ALTER DATABASE BCMdb SET RECOVERY BULK_LOGGED4 BACKUP DATABASE BCMdb TO DISK='D:/BCMdb.bak'5 GO6 DBCC TRACEON(3604)7 DBCC PAGE('BCMdb',1,7,3)
可以清楚看到,沒有看到因大容量日志操作而造成的分區改變。我們來執行一個大容量日志操作。
1 SELECT * INTO BCMdb..SalesOrderDetail FROM AdventureWorks2008R2.sales.SalesOrderDetail2 DBCC TRACEON(3604)3 DBCC PAGE('BCMdb',1,7,3)
可以看到,有2條被標記為MIN_LOGGED 。第1條是因為IAM頁中的改變,第2條是因為SELECT INTO插入的數據操作?,F在當我們進行日志備份,SQL Server會備份事務日志,就是BCM頁里標記為改變的區對應的事務日志。日志備份后,BCM頁的相關區,因大容量日志操作而打上改變的標記,會打上未改變的標記。我們來進行下日志備份。
1 BACKUP LOG BCMdb TO DISK='D:/BCMdblog.trn'2 GO3 DBCC PAGE('BCMdb',1,7,3)
注意,BCM頁不會因為完整或差異備份做相應改變。事務日志備份是剛才事務日志的基礎。SQL Server應該知道2個事務日志之間所發生的改變。如果差異或完整備份清空了BCM頁里的標記,下個事務日志備份就不能跟蹤或還原上一個日志備份和完整或差異備份之間的改變。簡而言之,一個完整或差異備份不會打斷事務日志備份鏈。
新聞熱點
疑難解答