L'index du magasin de colonnes dans le groupe de fichiers read_only empêche CheckDB

15

Il semble que la définition d'un groupe de fichiers read_onlyempêche dbcc checkdbtoute la base de données si le groupe de fichiers contient un index columnstore. Lorsque vous tentez d'exécuter checkdbou checkfilegroup( pour tout groupe de fichiers de la base de données, y compris les fichiers secondaires en lecture-écriture et[PRIMARY] ), l'erreur ci-dessous est renvoyée ...

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-t-il une méthode prise en charge pour avoir des données de magasin de colonnes dans un groupe de fichiers en lecture seule? Ou suis-je exclu des contrôles d'intégrité dans ce scénario?

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

Avis de non-responsabilité: publié sur les forums Technet

Peter Vandivier
la source

Réponses:

12

Le problème se produit lorsque DBCC essaie de vérifier un bitmap supprimé pour une table columnstore en lecture seule.

Les bitmaps supprimés sont stockés dans le même groupe de fichiers que la table columnstore. Ils suivent les lignes supprimées logiquement des groupes de lignes compressés.

Pour autant que je sache, tout est correctement organisé dans les tables système internes (sur SQL Server 2017 CU3), et la plupart du code DBCC tient correctement compte des ensembles de lignes masqués qui contiennent les bitmaps supprimés du magasin de colonnes.

Pour une raison quelconque, une vérification des groupes de fichiers hors ligne ou en lecture seule entraîne une exception non gérée:

Pile d'appels

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.

La même vérification hors ligne / en lecture seule est effectuée plusieurs fois plus tôt dans le traitement DBCC (lorsque les faits sont collectés) sans problème.

Le problème se produit lorsque DBCC CHECKDBou DBCC FILEGROUPest exécuté (sur n'importe quel groupe de fichiers), ou DBCC CHECKTABLEest invité à vérifier une table columnstore spécifique en lecture seule. Aucun de ces éléments ne doit produire une condition d'erreur fatale qui empêche le reste des vérifications DBCC de s'exécuter, il doit donc s'agir d'un bogue.


Ou suis-je exclu des contrôles d'intégrité dans ce scénario?

Comme solution de contournement, exécutez DBCC CHECKFILEGROUPsur le groupe de fichiers columnstore immédiatement avant qu'il ne soit mis en lecture seule (ou exécuté DBCC CHECKDBà ce moment-là) puis:

  1. DBCC CHECKALLOC sur la base de données
  2. Courir DBCC CHECKCATALOG
  3. Exécuter DBCC CHECKTABLEpour chaque table (à l'exclusion des tables columnstore sur un groupe de fichiers en lecture seule)
  4. Vous pouvez également vouloir exécuter DBCC CHECKCONSTRAINTS.

Voir Options de vérification de cohérence pour un VLDB par Paul Randal et Q&A Dividing DBCC CHECKDB sur plusieurs jours .

Paul White 9
la source
9

Tout d'abord, merci pour les informations et le code / situation de reproduction.

J'ai pris cela et déposé un élément interne, il a été attribué et sera examiné sous peu.

Vous pouvez voter pour le travail sur filegroup pour empêcher read_only dbcc checkdb de s'exécuter sur le site de commentaires SQL Server.

Je mettrai à jour cette réponse avec plus d'informations dès qu'elle sera disponible.

Sean dit de retirer Sara Chipps
la source