只读文件组中的列存储索引阻止 CheckDB

Pet*_*ier 15 sql-server filegroups columnstore dbcc-checkdb read-only-database

如果文件组包含列存储索引,则似乎设置文件组以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.
Run Code Online (Sandbox Code Playgroud)

是否有支持在只读文件组中存储列存储数据的方法?还是在这种情况下我无法进行完整性检查?

再现

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
Run Code Online (Sandbox Code Playgroud)

免责声明:交叉发布到technet 论坛

Pau*_*ite 12

当 DBCC 尝试验证只读列存储表的已删除位图时,会出现此问题。

删除的位图与列存储表存储在同一文件组中。它们跟踪从压缩行组中逻辑删除的行。

据我所知,内部系统表(在 SQL Server 2017 CU3 上)中的所有内容都被正确组织,并且大多数 DBCC 代码正确地说明了包含列存储删除位图的隐藏行集。

出于某种原因,检查脱机或只读文件组会导致未处理的异常:

调用栈

消息 8921,级别 16,状态 1,第 69 行
检查已终止。收集事实时检测到故障。
可能是 tempdb 空间不足或系统表不一致。
检查以前的错误。

相同的离线/只读检查在 DBCC 处理中(在收集事实时)更早地执行了几次,没有问题。

DBCC CHECKDBDBCC FILEGROUP运行(在任何文件组上)或被DBCC CHECKTABLE要求检查特定的只读列存储表时,就会出现问题。这些都不应该产生阻止其余 DBCC 检查运行的致命错误条件,因此这一定是一个错误。


还是在这种情况下我无法进行完整性检查?

作为一种解决方法,DBCC CHECKFILEGROUP在列存储文件组变为只读(或DBCC CHECKDB当时运行)之前立即在该文件组上运行,然后:

  1. DBCC CHECKALLOC 在数据库上
  2. DBCC CHECKCATALOG
  3. DBCC CHECKTABLE为每个表运行(不包括只读文件组上的列存储表)
  4. 您可能还想运行DBCC CHECKCONSTRAINTS.

请参阅Paul Randal的 VLDB一致性检查选项多天的问答划分 DBCC CHECKDB


此错误已在SQL Server 2019 CU 8 中修复(错误参考 13598925)。它已向后移植到 SQL Server 2017,但没有针对它的 CU 条目。