DBCC (Transact-SQL)

Transact-SQL 程式設計語言提供可用來作為 SQL Server 資料庫主控台命令的 DBCC 陳述式。

資料庫主控台命令陳述式的分組類別目錄如下。

命令類別目錄

執行

維護

維護資料庫、索引或檔案群組的作業。

其他

啟用追蹤旗標或從記憶體中移除 DLL 之類的其他作業。

資訊

收集和顯示各類型資訊的作業。

驗證

資料庫、資料表、索引、目錄、檔案群組或資料庫頁面配置的驗證作業。

DBCC 命令有輸入參數和傳回值。所有 DBCC 命令參數都可以接受 Unicode 和 DBCS 常值。

DBCC 內部資料庫快照集使用方式

下列 DBCC 命令會在 Database Engine 所建立的內部唯讀資料庫快照集上運作。這可以防止在執行這些命令時,發生封鎖和並行問題。如需詳細資訊,請參閱<資料庫快照集>。

DBCC CHECKALLOC

DBCC CHECKDB

DBCC CHECKCATALOG

DBCC CHECKFILEGROUP

DBCC CHECKTABLE

 

當您執行這些 DBCC 命令時,Database Engine 會建立一個資料庫快照集,且會使它進入交易一致狀態。之後,DBCC 命令會針對這個快照集來進行檢查。DBCC 命令完成之後,會卸除這個快照集。

有時候,並不需要或無法建立內部資料庫快照集。當這個情況發生時,會針對實際的資料庫來執行 DBCC 命令。如果資料庫在線上,DBCC 命令會利用資料表鎖定來確保所檢查之物件的一致性。這個行為與指定了 WITH TABLOCK 選項的情況相同。

當在下列情況下執行 DBCC 命令時,不會建立內部資料庫快照集:

  • 針對 master,而且 SQL Server 執行個體在單一使用者模式中執行。

  • 針對 master 以外的資料庫,但已利用 ALTER DATABASE 陳述式,使資料庫進入單一使用者模式。

  • 針對唯讀資料庫。

  • 針對已利用 ALTER DATABASE 陳述式,設定為緊急模式的資料庫。

  • 針對 tempdb。在這個情況下,會因為內部限制而無法建立資料庫快照集。

  • 使用 WITH TABLOCK 選項。在這個情況下,DBCC 會接受要求,不會建立資料庫快照集。

當針對下列項目來執行命令時,DBCC 命令會使用資料表鎖定,而不是內部資料庫快照集:

  • 唯讀檔案群組

  • FAT 檔案系統

  • 不支援「具名資料流」的磁碟區。

  • 不支援「替代資料流」的磁碟區。

[!附註]

試圖利用 WITH TABLOCK 選項來執行 DBCC CHECKALLOC 或 DBCC CHECKDB 的對等部分,需要資料庫 X 鎖定。這個資料庫鎖定無法設定在 tempdb 或 master 上,在所有其他資料庫上,也可能會失敗。

[!附註]

如果無法建立內部資料庫快照集,在針對 master 執行 DBCC CHECKDB 時會失敗。

DBCC 命令的進度報告

sys.dm_exec_requests 目錄檢視包含 DBCC CHECKDB、CHECKFILEGROUP 和 CHECKTABLE 命令的進度和目前執行階段的相關資訊。percent_complete 資料行指出命令的完成比例,command 資料行則報告命令目前的執行階段。

進度單位的定義會隨著 DBCC 命令目前的執行階段而不同。有時候,進度會以資料庫頁面的資料粒度來報告;在其他階段,則以單一資料庫或配置修復的資料粒度來報告。下表描述每個執行階段,以及命令報告進度的資料粒度。

執行階段

說明

進度報告資料粒度

DBCC TABLE CHECK

在這個階段中,會檢查資料庫中各物件的邏輯和實體一致性。

資料庫頁面層級所報告的進度。

每檢查 1000 個資料庫頁面,就會更新進度報告值。 

DBCC TABLE REPAIR

如果指定了 REPAIR_FAST、REPAIR_REBUILD 或 REPAIR_ALLOW_DATA_LOSS,而且有必須加以修復的物件錯誤,就會在這個階段期間執行資料庫修復。

個別修復層級所報告的進度。

每次修復完成,就會更新計數器。

DBCC ALLOC CHECK

在這個階段期間,會檢查資料庫中的配置結構。

附註附註
DBCC CHECKALLOC 會執行相同的檢查。

不報告進度

DBCC ALLOC REPAIR

如果指定了 REPAIR_FAST、REPAIR_REBUILD 或 REPAIR_ALLOW_DATA_LOSS,而且有必須加以修復的配置錯誤,就會在這個階段期間執行資料庫修復。

不報告進度。

DBCC SYS CHECK

在這個階段期間,會檢查資料庫系統資料表。

資料庫頁面層級所報告的進度。

每檢查 1000 個資料庫頁面,就會更新進度報告值。

DBCC SYS REPAIR

如果指定了 REPAIR_FAST、REPAIR_REBUILD 或 REPAIR_ALLOW_DATA_LOSS,而且有必須加以修復的系統資料表錯誤,就會在這個階段期間執行資料庫修復。

個別修復層級所報告的進度。

每次修復完成,就會更新計數器。

DBCC SSB CHECK

在這個階段期間,會檢查 SQL Server Service Broker 物件。

附註附註
當執行 DBCC CHECKTABLE 時,不會執行這個階段。

不報告進度。

DBCC CHECKCATALOG

在這個階段期間,會檢查資料庫目錄的一致性。

附註附註
當執行 DBCC CHECKTABLE 時,不會執行這個階段。

不報告進度。

DBCC IVIEW CHECK

在這個階段中,會檢查資料庫中任何索引檢視的邏輯一致性。

在所檢查的個別資料庫檢視層級報告的進度。