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


15

如果文件组包含列存储索引,则似乎设置了文件组以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论坛

Answers:


12

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

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

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

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

调用堆栈

Msg 8921, Level 16, State 1, Line 69
Check terminated. A failure was detected while collecting facts.
Possibly tempdb out of space or a system table is inconsistent.
Check previous errors.

相同的脱机/只读检查在DBCC处理中(收集事实时)执行了多次,没有问题。

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


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

解决方法是,DBCC CHECKFILEGROUP在将列存储文件组设置为只读(或DBCC CHECKDB在那时运行)之前立即在columnstore文件组上运行,然后:

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

请参阅Paul Randal 撰写的VLDB一致性检查选项和Q&A 划分DBCC CHECKDB在多天内的内容


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.