web-dev-qa-db-fra.com

Seul checkdb physique échoue, mais un plein est terminé avec succès

J'exécute checkdb avec l'option physical_only et il échoue avec plusieurs erreurs comme ci-dessous:

Msg 8965, niveau 16, état 1, ligne 1
Erreur de table: ID d'objet 1557580587, ID d'index 1, ID de partition 72057594088456192, attribuer l'ID d'unité 72057594177454080 (type Données en ligne). Le nœud de données hors ligne à la page (1: 13282192), emplacement 3, ID texte 6370769698816 est référencé par la page (0: 0), emplacement 0, mais n'a pas été vu dans l'analyse.
Msg 8965, niveau 16, état 1, ligne 1
Erreur de table: ID d'objet 1557580587, ID d'index 1, ID de partition 72057594088456192, attribuer l'ID d'unité 72057594177454080 (type Données en ligne). Le nœud de données hors ligne à la page (1: 13282192), emplacement 5, ID texte 6370769764352 est référencé par la page (0: 0), emplacement 0, mais n'a pas été vu dans l'analyse.
CHECKDB a trouvé 0 erreur d'allocation et 5255 erreurs de cohérence dans la table 'TableX' (ID d'objet 1557580587).
CHECKDB a trouvé 0 erreur d'allocation et 5255 erreurs de cohérence dans la base de données 'DatabaseX'. repair_allow_data_loss est le niveau de réparation minimum pour les erreurs trouvées par DBCC CHECKDB (DWH_LAND).

Cependant checkdb complet est réussi:

CHECKDB a trouvé 0 erreur d'allocation et 0 erreur de cohérence dans la base de données 'DatabaseX'. L'exécution de DBCC est terminée. Si DBCC a imprimé des messages d'erreur, contactez votre administrateur système.


TableX compte environ 200 000 lignes et contient un index columnstore en cluster.
Nous utilisons la version suivante de SQL Server:
Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) - 14.0.3048.4

Devrais-je m'inquiéter?

13
Andrzej Błoch

Oui, c'est un défaut dans SQL Server 2017 jusqu'à CU14. Il y avait un problème similaire avec index columnstore non cluster dans SQL Server 2016 .

C'est détaillé dans cette vidéo: Bogue CHECKDB avec SQL Server 2017 et les index ColumnStore

Une repro plus portable du problème est la suivante:

SELECT *, CONVERT(NVARCHAR(MAX), m.text + m.text + m.text + m.text + m.text) AS texty
INTO dbo.corrupt
FROM sys.messages AS m;

CREATE CLUSTERED COLUMNSTORE INDEX cx_corrupt ON dbo.corrupt;

DBCC CHECKDB WITH PHYSICAL_ONLY;

DROP TABLE dbo.corrupt;
13
Erik Darling