說明:災難恢複系列的文章是由 Robert Davis 寫的,發布在SQLSoldier, 個人認為挺不錯的,所以根據自己的理解,邊測試邊整理,並非直接翻譯,如有不準確,歡迎指正。
作為災難恢複這個系列的第一篇文章,我們看一下如果一個資料庫存在快照資料庫,那麼當執行DBCC CHECK命令時,是否會自動使用已存在的快照資料庫呢?我一直認為是不會的,並且也這樣告訴其它人。為了證明給我自己以及其它人,本篇將嘗試最終去證明DBCC CHECK命令將不會使用已存在的資料庫快照集。
執行DBCC CHECK命令時是否會自動使用已存在的快照資料庫 ?
我做了大量DBCC CHECK命令的調查試圖找到辦法查看DBCC CHECK命令是否有隱示的建立和使用資料庫快照集,最終發現快照沒有顯示在sys.databases, sys.master_file以及其它的系統目錄中,另外,資料庫快照集的建立不會觸發伺服器層級的事件也不會觸發庫層級的事件以及SQL跟蹤和擴充事件。
最終,我發現通過擴充示件的databases_dbcc_logical_scan事件可以看到它,這個事件會返回當前正針對某個資料庫啟動並執行資料庫的ID以及實際正在哪個資料庫上操作的資料庫ID,當前實際操作的資料庫是一個隱藏的資料為快照,它的database_id不會顯示在sys.databases,而且DB_NAME()函數會返回它的來源資料庫的名稱,我設定了一個擴充事件會話來收集databases_dbcc_logical_scan事件,它含有database_id和database_name列。我使用ring buffer target因為我並不打算保留任何資料,執行下面的指令碼,它暫時還未啟用。
CREATE EVENT SESSION [TestSnap] ON SERVER ADD EVENT sqlserver.databases_dbcc_logical_scan( ACTION(sqlserver.database_id, sqlserver.database_name)) ADD TARGET package0.ring_bufferWITH (MAX_DISPATCH_LATENCY=30 SECONDS, MAX_EVENT_SIZE=0 KB);
然後為AdventureWorks2012資料庫建立一個快照庫AWSnap,這樣我們就有了一個已存在的資料庫和它的快照庫。
CREATE DATABASE AWSnap ON (NAME = N'AdventureWorks2012_Data', FILENAME = N'D:\SQL2012\SNP\AdventureWorks2012_Data.ndf') AS SNAPSHOT OF AdventureWorks2012;
現在啟用擴充事件會話,如點擊Start Session,然後再點擊Watch Live Data,這樣當對AdventureWorks2012資料庫運行DBCC CHECKDB時就能即時看到事件內容,接下來我們開啟一個查詢時段運行DBCC CHECKDB。
從中我們可以看到每一個記錄中,database_id和database_id(action)都是不同的,如果你查詢sys.databases那麼沒有database_id(action)的ID記錄,如果我們用DB_NAME(7)查資料庫名稱,當DBCC CHECKDB正在運行時,它返回AdventureWorks2012,當DBCC CHECKDB運行完後,它返回NULL.