DBCC CHECKTABLE (Transact-SQL)

更新: 2008 年 11 月 17 日

檢查組成資料表或索引檢視表之所有頁面和結構的完整性。

主題連結圖示Transact-SQL 語法慣例

語法

DBCC CHECKTABLE 
(
        table_name | view_name
    [ , { NOINDEX | index_id }
     |, { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } 
    ] 
)
    [ WITH 
        { ALL_ERRORMSGS ]
          [ , NO_INFOMSGS ]
          [ , TABLOCK ] 
          [ , ESTIMATEONLY ] 
          [ , { PHYSICAL_ONLY | DATA_PURITY } ] 
        }
    ]

引數

  • table_name | view_name
    這是要執行完整性檢查的資料表或索引檢視表。資料表或檢視表名稱必須符合識別碼的規則。
  • NOINDEX
    指定不應執行大量檢查使用者資料表的非叢集索引。這會減少整體的執行時間。NOINDEX 不會影響系統資料表,因為所有系統資料表索引一律會執行完整性檢查。
  • index_id
    這是要執行完整性檢查的索引識別 (ID) 碼。如果指定了 index_id,DBCC CHECKTABLE 只會執行這個索引及堆積或叢集索引的完整性檢查。
  • REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
    指定 DBCC CHECKTABLE 修復找到的錯誤。若要使用修復選項,資料庫必須在單一使用者模式中。

    • REPAIR_ALLOW_DATA_LOSS
      嘗試修復所有報告的錯誤。這些修復可能會造成某些資料的遺失。
    • REPAIR_FAST
      維護語法的目的,只是為了與舊版相容。不會執行任何修復動作。
    • REPAIR_REBUILD
      同時執行次要、不耗時的修復動作 (例如,修改非叢集索引中的額外索引鍵),以及耗時的修復 (例如,重建索引)。執行這類修復沒有資料遺失的危險。
    ms174338.note(zh-tw,SQL.90).gif附註:
    最好不要使用這些 REPAIR 選項。若要修復錯誤,我們建議您從備份中還原。修復作業並不考慮資料表或資料表之間的任何條件約束。如果指定的資料表涉及一或多項條件約束,建議您在修復作業之後,執行 DBCC CHECKCONSTRAINTS。如果您必須使用 REPAIR,請執行不含修復選項的 DBCC CHECKDB 來尋找要使用的修復層級。如果您要使用 REPAIR_ALLOW_DATA_LOSS 層級,建議您在搭配這個選項執行 DBCC CHECKDB 之前,先備份資料庫。
  • ALL_ERRORMSGS
    顯示沒有限制的錯誤數目。在 SQL Server 2005 Service Pack 3 (SP3) 中,預設會顯示所有錯誤訊息。指定或省略這個選項沒有任何作用。在舊版 SQL Server 中,如果未指定 ALL_ERRORMSGS,則只會顯示每個物件的前 200 個錯誤訊息。
  • NO_INFOMSGS
    抑制所有參考訊息。
  • TABLOCK
    使 DBCC CHECKTABLE 取得共用資料表鎖定,而不使用內部資料庫快照集。TABLOCK 會使 DBCC CHECKTABLE 在負荷很重的情況下,仍能在資料表上執行得比較快,但當 DBCC CHECKTABLE 在執行中,它會降低資料表上所能使用的並行性。
  • ESTIMATEONLY
    顯示設定所有其他指定的選項,來執行 DBCC CHECKTABLE 所需要的 tempdb 估計空間量。
  • PHYSICAL_ONLY
    將檢查限制於頁面實體結構、記錄標頭和 B 型樹狀目錄之實體結構的完整性。這個項目是專為了提供資料表實體一致性的小型負擔檢查而設計的,這項檢查也能夠偵測到損毀的頁面以及可能危及資料的一般硬體失敗。在 SQL Server 2005 中,完整執行 DBCC CHECKTABLE 所需要的時間可能比舊版長許多。這個行為的原因如下:

    • 邏輯檢查更完整。
    • 部分要檢查的基礎結構更複雜。
    • 導入了許多新的檢查,以併入 SQL Server 2005 中的新功能。

    因此,使用 PHYSICAL_ONLY 選項可能使大型資料表 DBCC CHECKTABLE 的執行階段縮短許多,因此,建議您在實際系統上經常使用它。我們仍建議您定期完整執行 DBCC CHECKTABLE。這些執行動作的頻率取決於個別商務和實際執行環境特有的因素。PHYSICAL_ONLY 一律隱含 NO_INFOMSGS,不允許使用任何修復選項。

  • DATA_PURITY
    使 DBCC CHECKTABLE 檢查資料表,找出無效或超出範圍的資料行值。例如,DBCC CHECKTABLE 偵測到資料行具有大於或小於 datetime 資料類型可接受範圍的日期和時間值;或者,decimal 或近似數值資料類型資料行具有無效的小數位數或有效位數值。

    對於在 SQL Server 2005 中所建立的資料庫,依預設會啟用資料行值的完整性檢查而不需要 DATA_PURITY 選項。對於從舊版 SQL Server 升級的資料庫,您可以使用 DBCC CHECKTABLE WITH DATA_PURITY 尋找並更正特定資料表的錯誤,不過,必須先在毫無錯誤的情況下完成對資料庫執行 DBCC CHECKDB WITH DATA_PURITY,否則依預設不對資料表啟用資料行值檢查。此後,依預設 DBCC CHECKDB 和 DBCC CHECKTABLE 會檢查資料行值的完整性。

    這個選項報告的驗證錯誤無法使用 DBCC 修復選項更正。如需有關手動更正錯誤的詳細資訊,請參閱知識庫文件 923247:<疑難排解 SQL Server 2005 中的 DBCC 錯誤 2570>(英文)。

    如果指定 PHYSICAL_ONLY,則不會執行資料行完整性檢查。

結果集

DBCC CHECKTABLE 會傳回下列結果集。如果您只指定了資料表名稱或任何選項,就會傳回相同的結果集。

DBCC results for 'HumanResources.Employee'.
There are 288 rows in 13 pages for object 'Employee'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

如果指定了 ESTIMATEONLY 選項,DBCC CHECKTABLE 會傳回下列結果集:

Estimated TEMPDB space needed for CHECKTABLES (KB) 
-------------------------------------------------- 
21
(1 row(s) affected)
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

備註

除非指定了 NOINDEX 選項,否則 DBCC CHECKTABLE 會執行單一資料表或索引檢視表及其所有非叢集和 XML 索引的一致性檢查。若要在資料庫的每份資料表上執行 DBCC CHECKTABLE,請使用 DBCC CHECKDB

DBCC CHECKTABLE 會確認指定資料表的下列項目:

  • 已正確連結索引、in-row、LOB 和資料列溢位資料頁面。
  • 索引符合正確的排序順序。
  • 指標一致。
  • 每個頁面中的資料都是合理的,其中包括計算資料行。
  • 頁面位移合理。
  • 基底資料表的每個資料列在每個非叢集索引中都有相符的資料列,反之亦然。
  • 資料分割資料表或索引中的每個資料列都在正確的資料分割中。

內部資料庫快照集

DBCC CHECKTABLE 會利用內部資料庫快照集來提供執行這些檢查所需具備的交易一致性。如需詳細資訊,請參閱<瞭解資料庫快照集內的疏鬆檔案大小>和<DBCC (Transact-SQL)>中的「DBCC 內部資料庫快照集使用方式」一節。

如果無法建立快照集,或指定了 TABLOCK,DBCC CHECKTABLE 會獲取得共用資料表鎖定來取得必要的一致性。

ms174338.note(zh-tw,SQL.90).gif附註:
如果是針對 tempdb 來執行 DBCC CHECKTABLE,它就必須獲取共用資料表鎖定。這是因為基於效能的考量,tempdb 並無法使用資料庫快照集。這表示無法取得必要的交易一致性。

平行檢查物件

依預設,DBCC CHECKTABLE 會執行物件的平行檢查。查詢處理器會自動判斷平行處理原則的程度。最大平行處理原則程度的設定方式與平行查詢相同。若要限制 DBCC 檢查所能使用的最大處理器數目,請使用 sp_configure。如需詳細資訊,請參閱<max degree of parallelism 選項>。

您可以利用追蹤旗標 2528 來停用平行檢查。如需詳細資訊,請參閱<追蹤旗標 (Transact-SQL)>。

ms174338.note(zh-tw,SQL.90).gif附註:
在 DBCC CHECKTABLE 作業期間,儲存在按位元組排序之使用者自訂類型資料行的位元組,必須等於使用者自訂類型值的計算序列化。如果不是這樣,DBCC CHECKTABLE 常式將會報告一致性錯誤。

了解 DBCC 錯誤訊息

DBCC CHECKTABLE 命令執行完成之後,SQL Server 錯誤記錄檔中會寫入一則訊息。如果 DBCC 命令執行成功,該訊息將指出命令已順利完成,並顯示命令執行的時間量。如果 DBCC 命令由於發生錯誤而在完成檢查之前停止執行,則訊息中會指出命令已經終止,並顯示狀態值以及命令執行的時間量。下表列出並描述可以包含在訊息中的狀態值。

狀態 描述

0

已引發錯誤號碼 8930。這表示中繼資料損毀使 DBCC 命令終止。

1

已引發錯誤號碼 8967。發生內部 DBCC 錯誤。

2

修復緊急模式資料庫期間發生失敗。

3

這表示中繼資料損毀使 DBCC 命令終止。

4

偵測到判斷提示或存取違規。

5

發生使 DBCC 命令終止的未知錯誤。

錯誤報告

在 SQL Server 2005 Service Pack 1 (SP1) 中,每當 DBCC CHECKTABLE 偵測到損毀錯誤時,都會在 SQL Server LOG 目錄中建立小型傾印檔案 (SQLDUMPnnnn.txt)。當 SQL Server 的執行個體已啟用「功能使用方式」資料收集及「錯誤報告」功能時,這個檔案會自動轉送到 Microsoft。收集的資料是用來提升 SQL Server 的功能。如需詳細資訊,請參閱<錯誤和使用方式報表設定>。

傾印檔案包含 DBCC CHECKTABLE 命令的結果以及其他診斷輸出。該檔案限制了任意存取控制清單 (DACL)。存取權限制為 SQL Server 服務帳戶及 sysadmin 角色的成員。根據預設,sysadmin 角色包含 Windows BUILTIN\Administrators 群組以及本機管理員群組的所有成員。如果資料收集程序失敗,DBCC 命令不會失敗。

解決錯誤

如果 DBCC CHECKTABLE 報告任何錯誤,建議您從資料庫備份還原資料庫,而不要設定下列 REPAIR 選項之一來執行 REPAIR。如果沒有任何備份,執行 REPAIR 可以更正所報告的錯誤。要用的 REPAIR 選項指定在報告的錯誤清單尾端。不過,利用 REPAIR_ALLOW_DATA_LOSS 選項來更正錯誤,可能需要刪除某些頁面,因而也需要刪除某些資料。

您可以在使用者交易之下執行修復,讓使用者回復已進行的變更。如果回復修復,資料庫仍會包含錯誤,且必須從備份中還原。完成所有修復之後,請備份資料庫。

權限

使用者必須擁有資料表,或是 sysadmin 固定伺服器角色、db_owner 固定資料庫角色或 db_ddladmin 固定資料庫角色的成員。

範例

A. 檢查特定資料表

下列範例會檢查 AdventureWorks 資料庫中之 HumanResources.Employee 資料表的資料頁面完整性。

USE AdventureWorks;
GO
DBCC CHECKTABLE ("HumanResources.Employee");
GO

B. 執行資料表的低負擔檢查

下列範例會執行 AdventureWorks 資料庫中之 Employee 資料表的低負擔檢查。

USE AdventureWorks;
GO
DBCC CHECKTABLE ("HumanResources.Employee") WITH PHYSICAL_ONLY;
GO

C. 檢查特定索引

下列範例會檢查存取 sys.indexes 所取得的特定索引。

USE AdventureWorks;
GO
DECLARE @indid int;
SET @indid = (SELECT index_id 
              FROM sys.indexes
              WHERE object_id = OBJECT_ID('Production.Product')
                    AND name = 'AK_Product_Name');
DBCC CHECKTABLE ("Production.Product", @indid);

請參閱

參考

DBCC (Transact-SQL)

其他資源

資料表與索引架構
疑難排解索引檢視的 DBCC 錯誤

說明及資訊

取得 SQL Server 2005 協助

變更歷程記錄

版本 歷程記錄

2008 年 11 月 17 日

新增內容:
  • 在 ALL_ERRORMSGS 的定義中,描述 SP3 的新增功能。

2006 年 12 月 12 日

新增內容:
  • 在「語法」和「引數」章節中新增 DATA_PURITY 選項。

2006 年 4 月 14 日

新增內容:
  • 在「備註」一節中,新增「錯誤報告」小節。此章節會描述 SP1 中的新功能。

2005 年 12 月 5 日

新增內容:
  • 新增使用者定義類別的附註。
變更的內容:
  • 更正 REPAIR_FAST 定義。此選項不會執行修復動作。
  • 更正語法。
  • 更正範例 C。