只讀文件組中的列儲存索引阻止 CheckDB
如果文件組包含列儲存索引,則似乎將文件組設置為
read_only
阻止dbcc checkdb
整個數據庫。當嘗試執行checkdb
或checkfilegroup
(對於數據庫中的任何文件組,包括讀寫輔助文件和[PRIMARY]
)時,將返回以下錯誤…Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors.
是否有支持將列儲存數據保存在只讀文件組中的方法?或者在這種情況下我是否被排除在完整性檢查之外?
複製品
create database check_fg_ro go use check_fg_ro go exec sp_changedbowner 'sa'; go alter database check_fg_ro add filegroup check_fg_ro_2; alter database check_fg_ro add file ( name='check_fg_ro_2' ,filename='C:\check_fg_ro_2.ndf' ) to filegroup check_fg_ro_2; go create table foo ( i int not null primary key ) on check_fg_ro_2; go create columnstore index ccix_foo on foo(i); go use master go alter database check_fg_ro modify filegroup check_fg_ro_2 read_only; go dbcc checkdb( check_fg_ro ) with no_infomsgs, all_errormsgs, extended_logical_checks; /* Msg 8921, Level 16, State 1, Line 24 Check terminated. A failure was detected while collecting facts. Possibly tempdb out of space or a system table is inconsistent. Check previous errors. */ go
免責聲明:交叉發佈到technet 論壇
當 DBCC 嘗試驗證只讀列儲存表的已刪除點陣圖時,會出現此問題。
刪除的點陣圖儲存在與列儲存表相同的文件組中。它們跟踪從壓縮行組中邏輯刪除的行。
據我所知,所有內容都在內部系統表中正確組織(在 SQL Server 2017 CU3 上),並且大多數 DBCC 程式碼正確地說明了保存列儲存已刪除點陣圖的隱藏行集。
出於某種原因,檢查離線或只讀文件組會導致未處理的異常:
消息 8921,級別 16,狀態 1,第 69 行
檢查已終止。收集事實時檢測到故障。
可能是 tempdb 空間不足或系統表不一致。
檢查以前的錯誤。
在 DBCC 處理(收集事實時)之前多次執行相同的離線/只讀檢查,沒有問題。
當
DBCC CHECKDB
或DBCC FILEGROUP
執行(在任何文件組上)或被DBCC CHECKTABLE
要求檢查特定的只讀列儲存表時,會出現此問題。這些都不應該產生阻止其餘 DBCC 檢查執行的致命錯誤條件,因此這一定是一個錯誤。或者在這種情況下我是否被排除在完整性檢查之外?
作為一種解決方法,在列儲存文件組變為只讀(或當時執行)之前立即在列儲存文件組上執行,然後:
DBCC CHECKFILEGROUP
DBCC CHECKDB
DBCC CHECKALLOC
在數據庫上- 跑步
DBCC CHECKCATALOG
- 為每個表執行(不包括只讀文件組上的列儲存表)
DBCC CHECKTABLE
- 您可能還想執行.
DBCC CHECKCONSTRAINTS
請參閱Paul Randal的 VLDB 一致性檢查選項和 Q & A 將 DBCC CHECKDB 劃分為多天。
此錯誤已在SQL Server 2019 CU 8中修復(錯誤參考 13598925)。它已向後移植到 SQL Server 2017,但沒有 CU 條目。