如果文件组包含列存储索引,则似乎设置文件组以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 代码正确说明了隐藏的行集,这些行集包含已删除的列存储位图。
出于某种原因,检查脱机或只读文件组会导致未处理的异常:
相同的脱机/只读检查在 DBCC 处理(收集事实时)中执行了多次,没有问题。
当
DBCC CHECKDB
orDBCC FILEGROUP
运行时(在任何文件组上)或被DBCC CHECKTABLE
要求检查特定的只读列存储表时会出现问题。这些都不会产生阻止其余 DBCC 检查运行的致命错误条件,因此这一定是一个错误。作为解决方法,
DBCC CHECKFILEGROUP
在列存储文件组变为只读之前立即运行它(或DBCC CHECKDB
在那个时候运行)然后:DBCC CHECKALLOC
在数据库上DBCC CHECKCATALOG
DBCC CHECKTABLE
(不包括只读文件组上的列存储表)DBCC CHECKCONSTRAINTS
.请参阅Paul Randal撰写的 VLDB 的一致性检查选项和多日划分 DBCC CHECKDB的问答。
此错误已在SQL Server 2019 CU 8中修复(错误参考 13598925)。它已向后移植到 SQL Server 2017,但没有它的 CU 条目。