共用方式為


Analysis Services 的資料庫一致性檢查程式 (DBCC)

適用於: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

DBCC 為 Analysis Services 實例上的多維度和表格式資料庫提供隨選資料庫驗證。 您可以在 SQL Server Management Studio 的 MDX 或 XMLA 查詢視窗中執行 DBCC,並在 SSMS 中的 SQL Server Profiler 或 xEvent 會話中追蹤 DBCC 輸出。
此命令會取得物件定義,並在物件損毀時傳回空的結果集或詳細的錯誤資訊。 在本文中,您將瞭解如何執行命令、解譯結果,以及解決所發生的任何問題。

針對表格式資料庫,DBCC 執行的一致性檢查相當於每次重載、同步處理或還原資料庫時自動發生的內建驗證。 相反地,只有在您視需要執行 DBCC 時,才會對多維度資料庫進行一致性檢查。

驗證檢查的範圍會因模式而異,表格式資料庫受限於更廣泛的檢查範圍。
DBCC 工作負載的特性也會因伺服器模式而異。 檢查多維度資料庫的作業牽涉到從磁碟讀取數據、建構暫存索引來比較實際索引,這一切都需要相當長的時間才能完成。

DBCC 的命令語法會使用您所檢查之資料庫類型特有的物件元資料:

  • 多維度 + 預 SQL Server 2016 表格式 1100 或 1103 相容性層級資料庫描述於多維度模型建構中,例如 cubeIDmeasuregroupIDpartitionID

  • 相容性層級 1200 和更高層級之新表格式模型資料庫的元數據包含描述項,例如 TableNamePartitionName

只要資料庫在 SQL Server 2016 實例上執行,適用於 Analysis Services 的 DBCC 將會在任何相容性層級的任何 Analysis Services 資料庫上執行。 請確定您為每個資料庫類型使用正確的命令語法。

注意

如果您熟悉 DBCC(Transact-SQL),您很快就會注意到 Analysis Services 中的 DBCC 範圍要窄得多。 Analysis Services 中的 DBCC 是單一命令,專門報告資料庫或個別對象上的數據損毀。 如果您有其他工作,例如收集資訊,請嘗試改用 AMO PowerShell 或 XMLA 腳本。

許可權需求

您必須是 Analysis Services 資料庫或伺服器管理員(伺服器角色的成員)才能執行命令。 如需指示,請參閱 授與資料庫許可權 (Analysis Services)授與 Analysis Services 實例 管理員許可權。

命令語法

1200 和更高相容性層級的表格式資料庫會針對物件定義使用表格式元數據。 下列範例說明在 SQL Server 2016 功能等級建立之表格式資料庫的完整 DBCC 語法。

這兩種語法之間的主要差異包括較新的 XMLA 命名空間、沒有 <Object> 元素,也沒有 <Model> 元素(每個資料庫仍有一個模型)。

<DBCC xmlns="http://schemas.microsoft.com/analysisservices/2014/engine">  
     <DatabaseID>MyTabular1200DB_7811b5d8-c407-4203-8793-12e16c3d1b9b</DatabaseID>  
     <TableName>FactSales</TableName>  
     <PartitionName>FactSales 4</PartitionName>  
</DBCC>  

您可以省略較低層級的物件,例如數據表或分割區名稱,以檢查整個架構。

您可以透過每個物件的屬性頁,從 Management Studio 取得物件名稱和 DatabaseID。

多維度和表格式 110x 資料庫的命令語法

DBCC 針對多維度和表格式 1100 和 1103 資料庫使用相同的語法。 您可以針對特定資料庫物件執行 DBCC,包括整個資料庫。 如需物件定義的詳細資訊,請參閱 Object Element (XMLA)

<DBCC xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">  
     <Object>  
          <DatabaseID>AdventureWorksDW2014Multidimensional-EE</DatabaseID>  
          <CubeID>Adventure Works</CubeID>  
          <MeasureGroupID>Fact Internet Sales 1</MeasureGroupID>  
          <PartitionID>Internet_Sales_2006</PartitionID>  
     </Object>  
</DBCC>  
  

若要在物件鏈結較高層級的物件上執行 DBCC,請刪除您不需要的任何較低層級物件識別符元素:

<DBCC xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">  
     <Object>  
          <DatabaseID>AdventureWorksDW2014Multidimensional-EE</DatabaseID>  
          <CubeID>Adventure Works</CubeID>  
     </Object>  
</DBCC>  
  

對於表格式 110x 資料庫,對象定義語法是在 Process 命令的語法之後模型化(具體來說,數據表如何對應至維度和量值群組)。

  • CubeID 對應至模型識別碼,Model

  • MeasureGroupID 對應至數據表標識符。

  • PartitionID 對應至分割區標識碼。

用法

在 SQL Server Management Studio 中,您可以使用 MDX 或 XMLA 查詢視窗叫用 DBCC。 此外,您可以使用 SQL Server 2017 Profiler 或 Analysis Services xEvents 來檢視 DBCC 輸出。 請注意,SSAS DBCC 訊息不會回報給 Windows 應用程式事件記錄檔或msmdsrv.log檔案。

DBCC 會檢查實體數據損毀,以及當孤立成員存在於區段中時發生的邏輯數據損毀。 您必須先處理資料庫,才能執行 DBCC。 它會略過遠端、空白或未處理的數據分割。

命令會在讀取交易中執行,因此可以強制認可逾時來淘汰。 數據分割檢查會以平行方式執行。

可能需要重新啟動服務,才能挑選自上次服務重新啟動後發生的任何損毀錯誤。 重新連線到伺服器並不足以挑選變更。

在Management Studio中執行 DBCC 命令

針對臨機操作查詢,請在 SQL Server Management Studio 中開啟 MDX 或 XMLA 查詢視窗。 若要這樣做,請以滑鼠右鍵按兩下資料庫 |新的查詢 | XMLA)來執行命令並讀取輸出。

Management Studio 中的 DBCC XML 命令,

[結果] 索引標籤會指出空的結果集(如螢幕快照所示),如果未偵測到任何問題。

[訊息] 索引標籤會提供詳細資訊,但對於較小的資料庫不一定可靠。 有時候會修剪狀態消息,指出命令已完成,但不會在每個物件上檢查狀態檢查訊息。 一般訊息報告看起來可能類似下面所示的訊息報告。

從 DBCC 回報給 Cube 驗證檢查的訊息

Executing the query ...  
READS, 0  
READ_KB, 0  
WRITES, 0  
WRITE_KB, 0  
CPU_TIME_MS, 0  
ROWS_SCANNED, 0  
ROWS_RETURNED, 0  
  
<DBCC xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">  
<Object>  
<DatabaseID>AdventureWorksDW2014Multidimensional-EE</DatabaseID>  
<CubeID>Adventure Works</CubeID>  
</Object>  
</DBCC>  
Started checking segment indexes for the 'Internet_Sales_2011' partition.  
Started checking segment indexes for the 'Internet_Sales_2012' partition.  
Finished checking segment indexes for the 'Internet_Sales_2011' partition.  
Started checking segment indexes for the 'Internet_Sales_2013' partition.  
Finished checking segment indexes for the 'Internet_Sales_2012' partition.  
Started checking segment indexes for the 'Internet_Sales_2014' partition.  
Started checking segment indexes for the 'Internet_Orders_2011' partition.  
Finished checking segment indexes for the 'Internet_Sales_2014' partition.  
Started checking segment indexes for the 'Internet_Orders_2012' partition.  
Started checking segment indexes for the 'Internet_Orders_2013' partition.  
Finished checking segment indexes for the 'Internet_Orders_2012' partition.  
...   
Run complete  
  

針對舊版 Analysis Services 執行 DBCC 時 輸出

只有在 SQL Server 2017 實例上執行的資料庫上才支援 DBCC。 在較舊的系統上執行 命令將會傳回此錯誤。

Executing the query ...  
The DBCC element at line 7, column 87 (namespace http://schemas.microsoft.com/analysisservices/2003/engine) cannot appear under Envelope/Body/Execute/Command.  
Execution complete  
  

追蹤 SQL Server Profiler 中的 DBCC 輸出

您可以在 Profiler 追蹤中檢視 DBCC 輸出,其中包含進度報表事件(進度報表開始、進度報表目前、進度報表結束和進度報告錯誤)。

  1. 啟動追蹤。 請參閱 使用 SQL Server Profiler 監視 Analysis Services,以取得如何搭配 Analysis Services 使用 SQL Server Profiler 的說明。

  2. 選擇 [命令開始],然後 [命令結束] 加上任何或所有 進度報表 事件。

  3. 使用上一節所提供的語法,在Management Studio中執行 XMLA 或 MDX 查詢視窗中的 DBCC 命令。

  4. 在 SQL Server Profiler 中,DBCC 活動是透過具有 DBCC 事件子類別的 Command 事件來指出:

    SQL Server Analysis Services DBCC 分析工具 EventSubclass 結果的螢幕快照。

    事件程式代碼 32 是 DBCC 執行。

    事件代碼 64 是個別物件的 DBCC 進度報告。

    事件代碼 63 是多維度物件的區段檢查。

    針對這兩個事件子集,請檢閱 TextData DBCC 所傳回訊息的值。

    狀態消息開頭為「檢查 <物件>的一致性」、「開始檢查 <物件>」或「已完成檢查 <物件>」。

    注意

    在 CTP 3.0 中,物件是由內部名稱所識別。 例如,Categories 階層會以 H$Categories-<objectID>來表達。 內部名稱應取代為即將推出的 CTP 中用戶易記名稱。

    錯誤訊息如下所列。

追蹤 SSMS 中 xEvent 工作階段中的 DBCC 輸出

擴充事件會話可以使用分析工具事件或 xEvent。 如需新增 命令進度報表 事件的指引,請參閱上一節。

  1. 以滑鼠右鍵按兩下資料庫 >管理>擴充事件>工作階段>[新增工作階段]來啟動工作階段。 如需詳細資訊,請參閱 使用 SQL Server 擴充事件監視 Analysis Services

  2. 針對 Profiler 事件類別,選擇任何或所有 進度報告 事件,或針對 PureXevent 類別 RequestProgress 事件。

  3. 使用上一節所提供的語法,在Management Studio中執行 XMLA 或 MDX 查詢視窗中的 DBCC 命令。

  4. 在 SSMS 中,重新整理 Sessions 資料夾。 以滑鼠右鍵按下工作階段名稱,>監看即時資料

  5. 檢閱 DBCC 所傳回之訊息的 TextData 值。 TextData 是事件字段的屬性,並顯示事件傳回的狀態和錯誤訊息。

    狀態消息開頭為「檢查 <物件>的一致性」、「開始檢查 <物件>」或「已完成檢查 <物件>」。

    錯誤訊息如下所列。

參考:多維度資料庫的一致性檢查和錯誤

對於多維度資料庫,只會驗證分割區索引。 在執行期間,DBCC 會為每個分割區建置暫存索引,並將它與磁碟上的保存索引進行比較。 建置暫存索引需要從磁碟上的分割區數據讀取所有數據,然後將暫存索引放在記憶體中進行比較。 假設有額外的工作負載,您的伺服器在執行 DBCC 執行時可能會遇到大量的磁碟 IO 和記憶體耗用量。

偵測多維度索引損毀包括下列檢查。 此數據表中的錯誤會出現在 xEvent 或 Profiler 追蹤物件層級失敗。

物件 DBCC 檢查描述 失敗時發生錯誤
數據分割索引 檢查區段統計數據和索引。

比較暫存數據分割索引中每個成員的標識符,與儲存在磁碟上的分割區統計數據。 如果在暫存索引中找到成員,其數據識別符值超出磁碟上數據分割索引統計數據所儲存的範圍,則索引的統計數據會被視為損毀。
分割區區段統計數據已損毀。
數據分割索引 驗證元數據。

確認暫存索引中的每個成員都可以在磁碟上區段的索引頭檔中找到。
分割區區段已損毀。
數據分割索引 掃描區段以尋找實體損毀。

讀取暫存索引中每個成員磁碟上的索引檔案,並確認索引記錄的大小相符,而且相同的數據頁會標示為具有目前成員的記錄。
分割區區段已損毀。

參考:表格式資料庫的一致性檢查和錯誤

下表列出表格式對象上執行的所有一致性檢查,以及檢查指出損毀時所引發的錯誤。 此數據表中的錯誤會出現在 xEvent 或 Profiler 追蹤物件層級失敗。

物件 DBCC 檢查描述 失敗時發生錯誤
資料庫 檢查資料庫中的數據表計數。 小於零的值表示損毀。 儲存層中有損毀。 '%{parent/}' 資料庫中數據表的集合已損毀。
資料庫 檢查用來追蹤引用完整性的內部結構,並在大小不正確時擲回錯誤。 資料庫檔案無法通過一致性檢查。
桌子 檢查用來判斷數據表是否為 Dimension 或 Fact 數據表的內部值。 超出已知範圍的 值表示損毀。 檢查數據表統計數據時,資料庫一致性檢查 (DBCC) 失敗。
桌子 檢查數據表區段對應中的數據分割數目是否符合為數據表定義的分割區數目。 儲存層中有損毀。 '%{parent/}' 數據表中的數據分割集合已損毀。
桌子 如果從 PowerPivot for Excel 2010 建立或匯入表格式資料庫,而且具有大於一個的數據分割計數,則會引發錯誤,因為更新版本中已新增數據分割支援,這表示損毀。 檢查區段對應時,資料庫一致性檢查 (DBCC) 失敗。
分區 針對每個分割區,確認區段中每個數據區段的數據區段和記錄計數都符合區段索引中儲存的值。 檢查區段對應時,資料庫一致性檢查 (DBCC) 失敗。
分區 如果每個區段的總記錄、區段或記錄數目無效(小於零),或區段數目不符合根據總記錄計數所需的計算區段數目,則引發錯誤。 檢查區段對應時,資料庫一致性檢查 (DBCC) 失敗。
關係 如果用來儲存關聯性相關數據的結構不包含任何記錄,或關聯性中使用的數據表名稱是空的,則引發錯誤。 檢查關聯性時,資料庫一致性檢查 (DBCC) 失敗。
關係 確認已設定主數據表、主數據行、外部數據表和外部數據行的名稱,而且可以存取關聯性所涉及的數據行和數據表。

確認所涉及的數據行類型有效,且主要 Key-Foreign 索引鍵值的索引會產生有效的查閱結構。
檢查關聯性時,資料庫一致性檢查 (DBCC) 失敗。
等級制度 如果階層的排序順序不是可辨識的值,則引發錯誤。 檢查 '%{hier/}' 階層時,資料庫一致性檢查 (DBCC) 失敗。
等級制度 對階層執行的檢查取決於所使用的階層對應配置內部類型。

系統會檢查所有階層是否有正確的已處理狀態、階層存放區存在,以及適用時,用於數據標識碼到階層位置轉換的數據結構存在。

假設所有這些檢查都通過,階層結構會逐步解說,以確認階層中的每個位置都指向正確的成員。
如果其中任何一個測試失敗,就會引發錯誤。
檢查 '%{hier/}' 階層時,資料庫一致性檢查 (DBCC) 失敗。
用戶定義的階層 檢查階層層級名稱是否已設定。

如果已處理階層,請檢查內部階層數據存放區的格式是否正確。 確認內部階層存放區未包含任何無效的數據值。

如果階層標示為未處理,請確認此狀態適用於舊數據結構,而且階層的所有層級都會標示為空白。
檢查 '%{hier/}' 階層時,資料庫一致性檢查 (DBCC) 失敗。
如果用於數據行的編碼未設定為已知值,則引發錯誤。 檢查數據行統計數據時,資料庫一致性檢查 (DBCC) 失敗。
檢查數據行是否由記憶體內部引擎壓縮。 檢查數據行統計數據時,資料庫一致性檢查 (DBCC) 失敗。
檢查數據行上的壓縮類型是否有已知值。 檢查數據行統計數據時,資料庫一致性檢查 (DBCC) 失敗。
當數據行「Tokenization」未設定為已知值時,引發錯誤。 檢查數據行統計數據時,資料庫一致性檢查 (DBCC) 失敗。
如果針對數據行數據字典儲存的標識符範圍不符合數據字典中的值數目,或超出允許的範圍,則引發錯誤。 檢查數據字典時,資料庫一致性檢查 (DBCC) 失敗。
檢查數據行的數據區段數目是否符合其所屬數據表的數據區段數目。 儲存層中有損毀。 '%{parent/}' 數據行中的區段集合已損毀。
檢查數據行的數據分割數目是否符合數據行數據區段對應的數據分割數目。 檢查區段對應時,資料庫一致性檢查 (DBCC) 失敗。
確認數據行區段中的記錄數目符合儲存在該數據行區段之索引中的記錄計數。 儲存層中有損毀。 '%{parent/}' 數據行中的區段集合已損毀。
如果資料行沒有區段統計數據,請引發錯誤。 檢查區段統計數據時,資料庫一致性檢查 (DBCC) 失敗。
如果資料行沒有壓縮資訊或區段記憶體,請引發錯誤。 資料庫檔案無法通過一致性檢查。
如果數據行的區段統計數據不符合 [最小數據標識符]、[最大數據標識符]、[相異值數目]、[數據列數] 或 NULL 值的實際數據行值,則報告錯誤。 檢查區段統計數據時,資料庫一致性檢查 (DBCC) 失敗。
ColumnSegment 如果數據識別元下限或數據識別碼上限小於 NULL 的系統保留值,請將數據行區段資訊標示為損毀。 檢查區段統計數據時,資料庫一致性檢查 (DBCC) 失敗。
ColumnSegment 如果此區段沒有數據列,數據行的最小值和最大值應該設定為 NULL 的系統保留值。 如果值不是 Null,請引發錯誤。 檢查區段統計數據時,資料庫一致性檢查 (DBCC) 失敗。
ColumnSegment 如果數據行具有數據列和至少一個非 Null 值,請檢查數據行的最小值和最大數據識別碼大於 NULL 的系統保留值。 檢查區段統計數據時,資料庫一致性檢查 (DBCC) 失敗。
內部 確認已設定存放區令牌化提示,而且如果已處理存放區,內部數據表就會有有效的指標。 如果未處理存放區,請確認所有指標都是 Null。
如果沒有,則傳回泛型 DBCC 錯誤。
資料庫檔案無法通過一致性檢查。
DBCC 資料庫 如果資料庫架構沒有數據表或無法存取一或多個數據表,則引發錯誤。 儲存層中有損毀。 '%{parent/}' 資料庫中數據表的集合已損毀。
DBCC 資料庫 如果數據表標示為暫時或具有未知類型,則引發錯誤。 遇到不正確的數據表類型。
DBCC 資料庫 如果數據表的關聯性數目有負值,或找不到任何數據表已定義關聯性且找不到對應的關聯性結構,則引發錯誤。 儲存層中有損毀。 '%{parent/}' 數據表中關聯性的集合已損毀。
DBCC 資料庫 如果資料庫的相容性層級為 1050(SQL Server 2008 R2/PowerPivot v1.0),且關聯性數目超過模型中的數據表數目,請將資料庫標示為損毀。 資料庫檔案無法通過一致性檢查。
DBCC 數據表 針對正在驗證的數據表,檢查數據行數目是否小於零,如果為 true,則引發錯誤。 如果數據表中數據行的數據行存放區為 NULL,也會發生錯誤。 儲存層中有損毀。 '%{parent/}' 數據表中的數據行集合已損毀。
DBCC 分割區 檢查正在驗證之數據分割所屬的數據表,如果數據表的數據行數目小於零,表示數據表的 Columns 集合已損毀。 如果數據表中數據行的數據行存放區是 NULL,也會發生錯誤。 儲存層中有損毀。 '%{parent/}' 數據表中的數據行集合已損毀。
DBCC 分割區 迴圈查看所選取資料分割的每個資料行,並檢查資料分割的每個區段是否具有數據行區段結構的有效連結。 如果有任何區段具有 NULL 連結,則分割區會被視為損毀。 儲存層中有損毀。 '%{parent/}' 數據行中的區段集合已損毀。
如果數據行類型無效,則傳回錯誤。 遇到不正確的區段類型。
如果數據行中任何數據行的區段數為負數,或區段數據行區段結構的指標具有 NULL 連結,則傳回錯誤。 儲存層中有損毀。 '%{parent/}' 數據行中的區段集合已損毀。
DBCC 命令 DBCC 命令會在 DBCC 作業繼續進行時報告多個狀態消息。 它會在開始之前報告狀態消息,其中包含對象的資料庫、數據表或數據行名稱,並在完成每個物件檢查之後再次報告。 檢查 objectname><objecttype><objectname 的一致性。 階段:預先檢查。

檢查 objectname><objecttype><objectname 的一致性。 階段:檢查后。

錯誤狀況的常見解決方式

下列錯誤會出現在 SQL Server Management Studio 或 msmdsrv.log 檔案中。 當一或多個檢查無法通過時,會出現這些錯誤。 根據錯誤,建議的解決方法是重新處理物件、刪除和重新部署解決方案,或還原資料庫。

錯誤 問題 解析度
元數據管理員中的 錯誤

對象參考 '<objectID>' 無效。 它不符合元數據類別階層的結構。
格式不正確的命令 檢查命令語法。 最可能,您未指定一或多個父物件,即可包含較低層級的物件。
元數據管理員中的 錯誤

<物件> 標識符為 '<objectID>' 的物件不存在於標識符為 '<parentobjectID>' 的 <parentobjectect> 中,或使用者沒有存取物件的許可權。
索引損毀 (多維度) 重新處理物件和任何相依物件。
分割區 的一致性檢查期間發生 錯誤

從 <資料庫名稱> 資料庫,檢查 <measure-group-name> 量值 <群組 <數據分割名稱> 數據分割> cube 時發生錯誤。 請重新處理分割區或索引,以修正損毀。
索引損毀 (多維度) 重新處理物件和任何相依物件。
分割區區段統計數據已損毀 索引損毀 (多維度) 重新處理物件和任何相依物件。
分割區段已損毀 中繼資料損毀(多維度或表格式) 刪除並重新部署專案,或從備份還原並重新處理。

如需指示,請參閱 如何在 Analysis Services 資料庫中處理損毀 (部落格)
數據表元數據損毀

數據表 <數據表名稱> 元數據檔案已損毀。 在 DataFileList 節點下找不到主數據表。
中繼資料損毀(僅限表格式) 刪除並重新部署專案,或從備份還原並重新處理。

如需指示,請參閱 如何在 Analysis Services 資料庫中處理損毀 (部落格)
儲存層 損毀

儲存層損毀:<父名稱><父類型> 中 <類型名稱> 的集合已損毀。
中繼資料損毀(僅限表格式) 刪除並重新部署專案,或從備份還原並重新處理。

如需指示,請參閱 如何在 Analysis Services 資料庫中處理損毀 (部落格)
系統數據表遺失

遺漏系統數據表 <數據表名稱>。
物件損毀(僅限表格式) 重新處理物件和任何相依物件
數據表統計數據已損毀

遺漏數據表系統數據表 <數據表名稱> 的統計數據。
中繼資料損毀(僅限表格式) 刪除並重新部署專案,或從備份還原並重新處理。

如需指示,請參閱 如何在 Analysis Services 資料庫中處理損毀 (部落格)

停用資料庫載入作業的自動一致性檢查

雖然不建議這麼做,但您可以停用自動在資料庫載入事件上發生的內建資料庫一致性檢查(僅限表格式資料庫)。 若要這樣做,您必須修改 msmdsrv.ini 檔案中的組態設定:

<ConfigurationSettings>  
     <Vertipaq />  
          <DisableConsistencyChecks />  

此設定不存在於組態檔中,必須手動新增。

有效值如下所示:

  • -2 (預設) DBCC 已啟用。 如果伺服器以邏輯方式解決具有高度確定性的錯誤,則會自動套用修正程式。 否則,將會記錄錯誤。

  • -1 DBCC 部分啟用。 它已啟用 RESTORE,並在交易結束時檢查資料庫狀態的預先認可驗證。

  • 0 DBCC 部分啟用。 資料庫一致性檢查會在 RESTORE、IMAGELOAD、LOCALCUBELOAD 和 ATTACH 期間執行
    操作。

  • 1 DBCC 已停用。 數據完整性檢查已停用,但還原串行化檢查仍會發生。

注意

執行命令時,此設定不會影響 DBCC。

另請參閱

處理資料庫、數據表或分割區 (Analysis Services)
處理多維度模型 (Analysis Services)
Analysis Services 中表格式模型的 相容性層級
Analysis Services 中的伺服器屬性