Sql-Server

僅物理的 checkdb 失敗,但完整的已成功完成

  • May 20, 2019

我正在使用 physical_only 選項執行 checkdb,但它失敗並出現多個錯誤,如下所示:

消息 8965,級別 16,狀態 1,行 1
**表錯誤:**對象 ID 1557580587,索引 ID 1,分區 ID 72057594088456192,分配單元 ID 72057594177454080(類型行內數據)。頁 (1:13282192)、槽 3、文本 ID 6370769698816 處的行外數據節點被頁 (0:0)、槽 0 引用,但在掃描中未看到。
消息 8965,級別 16,狀態 1,行 1
**表錯誤:**對象 ID 1557580587,索引 ID 1,分區 ID 72057594088456192,分配單元 ID 72057594177454080(類型行內數據)。頁 (1:13282192)、槽 5、文本 ID 6370769764352 處的行外數據節點被頁 (0:0)、槽 0 引用,但在掃描中未看到。CHECKDB 在表“TableX” (對象 ID 1557580587)
中發現 0 個分配錯誤和 5255 個一致性錯誤。
CHECKDB 在數據庫 ‘DatabaseX’ 中發現 0 個分配錯誤和 5255 個一致性錯誤。repair_allow_data_loss 是 DBCC CHECKDB (DWH_LAND) 發現的錯誤的最低修復級別。

但是完整的checkdb是成功的:

**CHECKDB 在數據庫“DatabaseX”中發現 0 個分配錯誤和 0 個一致性錯誤。**DBCC 執行完成。如果 DBCC 列印錯誤消息,請聯繫您的系統管理員。

TableX 有大約 200 000 行,並且上面有聚集列儲存索引。

我們正在使用以下版本的 SQL Server:

Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4

我應該擔心嗎?

是的,這是 SQL Server 2017 到 CU14 中的一個缺陷。SQL Server 2016 中的非聚集列儲存索引也存在類似問題。

此影片中有詳細說明:使用 SQL Server 2017 和列儲存索引的 CHECKDB 錯誤

該問題的更便攜的再現是:

SELECT *, CONVERT(NVARCHAR(MAX), m.text + m.text + m.text + m.text + m.text) AS texty
INTO dbo.corrupt
FROM sys.messages AS m;

CREATE CLUSTERED COLUMNSTORE INDEX cx_corrupt ON dbo.corrupt;

DBCC CHECKDB WITH PHYSICAL_ONLY;

DROP TABLE dbo.corrupt;

引用自:https://dba.stackexchange.com/questions/238567