Un petit article pour parler de cette erreur assez courante qui se rencontre soit avec des versions antérieures à SQL Server 2005, soit à la suite d’une migration. Elle n’est pas très grave et plutôt bien décrite puisque la solution est indiquée dans le message (“Run DBCC UPDATEUSAGE”).
dbcc checkdb('MvxRef') with no_infomsgs, all_errormsgs Msg 2508, Niveau 16, État 1, Ligne 1 Le nombre In-row data USED page pour l'objet 'Client_NULL', ID d'index 0, ID de partition 29725599596544,ID d'unité d'allocation 29725599596544 (type In-row data) est incorrect. Exécutez DBCC UPDATEUSAGE. CHECKDB a trouvé 0 erreurs d'allocation et 1 erreurs de cohérence dans la table 'Client_NULL' (ID d'objet 453576654). CHECKDB a trouvé 0 erreurs d'allocation et 1 erreurs de cohérence dans la base de données 'MvxRef'.
Lorsque DBCC CHECKDB arrive sur un objet en particulier, il se constitue une synthèse des informations qui décrivent la table, et notamment le décompte de pages totales allouées, et de pages utilisées pour l’objet. Si une des valeurs est négative, le message 2508 est renvoyé avec en paramètre une indication sur quelle valeur est négative (RSVD pour le nombre total de pages, USED pour le nombre de pages utilisées). La valeur négative en question est remontée par la DMV sys.allocation_units:
select allocation_unit_id, type_desc, container_id,total_pages, used_pages
from sys.allocation_units AU inner join sys.partitions P on AU.container_id = P.hobt_id
and P.object_id = object_id('Client_NULL')
allocation_unit_id type_desc container_id total_pages used_pages
-------------------- ---------------- -------------------- -------------- ------------
29725599596544 IN_ROW_DATA 29725599596544 0 -104
Il se trouve que la table a été vidée de son contenu entre deux DBCC CHECKDB, et l’erreur n’avait pas été détectée immédiatement après la migration. Un petit coup de DBCC UPDATEUSAGE sur cette table:
dbcc updateusage('MvxRef','Client_NULL')
DBCC UPDATEUSAGE : nombre mis à jour pour la table 'Client_NULL'
(index 'Client_NULL', partition 1) :
Pages USED (In-row Data) : changement de (-104) pages en (0) pages.
Exécution de DBCC terminée. Si DBCC vous a adressé des messages d'erreur,
contactez l'administrateur système.
Et tout est rentré dans l’ordre:
select allocation_unit_id, type_desc, container_id,total_pages, used_pages
from sys.allocation_units AU inner join sys.partitions P on AU.container_id = P.hobt_id
and P.object_id = object_id('Client_NULL')
allocation_unit_id type_desc container_id total_pages used_pages
-------------------- ------------- -------------------- ------------- ------------
29725599596544 IN_ROW_DATA 29725599596544 0 0
A+. David B.
Continuez votre lecture sur le blog :
- Error 8976 / 8978, problèmes de chaînage, comment récupérer les données (David Baffaleuf) [SQL Server]
- Fragmentation sur des tables stockées en S-GAM (David Baffaleuf) [SQL Server]
- Suppression accidentelle de ligne : comment retrouver le coupable ? (David Baffaleuf) [SQL Server]
- Oracle et SQL Server: La Fragmentation (Benjamin VESAN) [OracleSQL Server]
- Alter table rebuild (Benjamin VESAN) [SQL Server]