Sql-Server

只讀文件組中的列儲存索引阻止 CheckDB

  • August 24, 2021

如果文件組包含列儲存索引,則似乎將文件組設置為read_only阻止dbcc checkdb整個數據庫。當嘗試執行checkdbcheckfilegroup對於數據庫中的任何文件組,包括讀寫輔助文件和[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 CHECKDBDBCC FILEGROUP執行(在任何文件組上)或被DBCC CHECKTABLE要求檢查特定的只讀列儲存表時,會出現此問題。這些都不應該產生阻止其餘 DBCC 檢查執行的致命錯誤條件,因此這一定是一個錯誤。


或者在這種情況下我是否被排除在完整性檢查之外?

作為一種解決方法,在列儲存文件組變為只讀(或當時執行)之前立即在列儲存文件組上執行,然後:DBCC CHECKFILEGROUPDBCC CHECKDB

  1. DBCC CHECKALLOC在數據庫上
  2. 跑步DBCC CHECKCATALOG
  3. 為每個表執行(不包括只讀文件組上的列儲存表)DBCC CHECKTABLE
  4. 您可能還想執行.DBCC CHECKCONSTRAINTS

請參閱Paul Randal的 VLDB 一致性檢查選項和 Q & A 將 DBCC CHECKDB 劃分為多天


此錯誤已在SQL Server 2019 CU 8中修復(錯誤參考 13598925)。它已向後移植到 SQL Server 2017,但沒有 CU 條目。

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