O índice columnstore no grupo de arquivos read_only impede o CheckDB


15

Aparece definir um grupo de arquivos para read_onlyimpedir dbcc checkdbo banco de dados inteiro se o grupo de arquivos contiver um índice columnstore. Ao tentar executar checkdbou checkfilegroup( por qualquer grupo de arquivos no banco de dados, incluindo secundários de leitura e gravação e[PRIMARY] ), o erro abaixo é retornado ...

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.

Existe um método suportado para ter dados columnstore em um grupo de arquivos somente leitura? Ou eu estou impedido de verificações de integridade neste cenário?

Repro

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

Isenção de responsabilidade: postado cruzado nos fóruns do technet

Respostas:


12

O problema ocorre quando o DBCC tenta verificar um bitmap excluído para uma tabela columnstore somente leitura.

Os bitmaps excluídos são armazenados no mesmo grupo de arquivos da tabela columnstore. Eles rastreiam linhas excluídas logicamente de grupos de linhas compactadas.

Pelo que sei, tudo está organizado corretamente nas tabelas internas do sistema (no SQL Server 2017 CU3), e a maioria do código DBCC é responsável pelos conjuntos de linhas ocultos que contêm os bitmaps excluídos do columnstore.

Por algum motivo, uma verificação de grupos de arquivos offline ou somente leitura resulta em uma exceção não tratada:

Pilha de chamadas

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.

A mesma verificação offline / somente leitura é executada várias vezes anteriormente no processamento DBCC (quando fatos estão sendo coletados) sem problemas.

O problema ocorre quando DBCC CHECKDBou DBCC FILEGROUPé executado (em qualquer grupo de arquivos) ou DBCC CHECKTABLEé solicitado que você verifique uma tabela columnstore somente leitura específica. Nenhum deles deve produzir uma condição de erro fatal que impeça a execução das demais verificações do DBCC; portanto, isso deve ser um erro.


Ou eu estou impedido de verificações de integridade neste cenário?

Como solução alternativa, execute DBCC CHECKFILEGROUPo grupo de arquivos columnstore imediatamente antes de torná-lo somente leitura (ou execute DBCC CHECKDBnesse momento):

  1. DBCC CHECKALLOC no banco de dados
  2. Corre DBCC CHECKCATALOG
  3. Executar DBCC CHECKTABLEpara cada tabela (excluindo tabelas columnstore em um grupo de arquivos somente leitura)
  4. Você também pode querer executar DBCC CHECKCONSTRAINTS.

Consulte Opções de verificação de consistência para um VLDB por Paul Randal e o Q & A Dividing DBCC CHECKDB por vários dias .


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.