Introduction
Option fix de la commande dbcc checkcatalog
Avec la version 12.5.2, le paramètre fix
a été ajouté dans la commande dbcc
checkcatalog
pour corriger les erreurs dans les vérifications de consistence de
la table système sysindexes
.
dbcc checkcatalog [(database_name [,fix])]
La base de données doit être mise en mode "single user
" pour pouvoir
utiliser l’option fix
, en effet le catalogue est impacté et la commande dbcc
gam
est mise en œuvre. Les nouvelles vérifications de sysindexes
avec la
version 12.5.2 peuvent soulever des erreurs non remontées par des versions
antérieures à la version 12.5.2.
Options all et fixall de la commande dbcc checkcatalog
Avec cette même version 12.5.2, lors de l’accès à une valeur de colonne d’une table de base de données, Adaptive Server a été amélioré afin de valider la longueur de la ligne et la longueur de la valeur de la colonne dans cette ligne et ce, à l’aide des informations stockées dans les catalogues système de cette base de données. Toute contradiction est reportée dans le fichier de log du serveur ASE avec le message :
Invalid column length: <length>. Value must be between 0 and <max col length> for '<row type>' row
with minimum row length of <min row length>.
Exemple :
Invalid column length: -48. Value must be between 0 and 8 for 'data-only'
row with minimum row length of 55.
Les nouvelles options all
et fixall
ont été spécialement implémentées dans
la commande dbcc checkcatalog
pour détecter et corriger ce type précis
d’inconsistence.
dbcc checkcatalog [(database_name [,"all"|fixall] )]
Comme pour l’option fix
, l’utilisation de l’option fixall
implique la mise
en mode "single user
" de la base de données.
Cas concret des options "all" et "fixall", Msg 15052
Détection avec dbcc checkcatalog "all"
Lorsque dans le fichier de log du serveur ASE apparaît l’erreur type
"Invalid column length…", la base de données peut être rapidement retrouvée
car à la fin de la "stack trace" dans le fichier de log, le suid
(Server User
Id) est mentionné. Ce suid
permet de retrouver le login associé dans
master..syslogins
et ainsi sa base de données par défaut avec
sp_displaylogin
.
00:00000:00185:2009/08/05 16:55:35.90 server
Invalid column length: -18. Value must be between 0 and 20 for
'data-only' row with minimum row length of 55.
00:00000:00185:2009/08/05 16:55:35.90 kernel pc: 0x01061f50 pcstkwalk+0x24(0x018d6400, 0x9c20be9c, 0x000027
0f, 0x00000002, 0x9c20cf60)
...
00:00000:00185:2009/08/05 16:55:35.90 kernel end of stack trace, spid 185,
kpid 118489382, suid 497
Dès que la base de données est retrouvée, exécuter la commande dbcc
checkcatalog
avec l’option "all
" sur la base en question. Le message d’erreur
Msg 15052 est alors levé :
dbcc checkcatalog (database_name ,"all" )
:dbcc checkcatalog (mir_nav,"all")
Checking mir_nav: Logical pagesize is 2048 bytes Msg 15052, Level 16, State 4 Server 'TST_T2_ASE', Line 1 Index error: Table id 8, indid 0 calculated maxlen 273 does not match value 2000 in Sysindexes. Found 1 errors in index 0 for table 8, run DBCC CHECKCATALOG(<db>, fix) or recreate the index to correct it. Msg 15052, Level 16, State 4 Server 'TST_T2_ASE', Line 1 Index error: Table id 14, indid 0 calculated maxlen 2 does not match value 0 in Sysindexes. Msg 15052, Level 16, State 5 Server 'TST_T2_ASE', Line 1 Index error: Table id 14, indid 0 calculated minlen 2 does not match value 0 in Sysindexes. Found 2 errors in index 0 for table 14, run DBCC CHECKCATALOG(<db>, fix) or recreate the index to correct it. The following segments have been defined for database 34 (database name mir_nav). virtual device number virtual start addr size (logical pages) segments --------------------- -------------------- ---------------------- -------------------- 86 256000 153600 2 85 2048000 256000 0 1 85 0 1024000 0 1 86 0 256000 2 85 1024000 512000 0 1 85 1536000 512000 0 1 DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
Dans cet exemple, des contradictions sont détectées dans sysindexes
pour
l’index 0 des tables syslogs
(Table id 8) et sysgams
(Table id 14).
La commande dbcc checkcatalog
suggère de recréer l’index si il s’agit d’un
index, mais ce n’est pas le cas dans l’exemple, il s’agit directement des
tables systèmes syslogs
et sysgams
, par ailleurs la recréation des indexes sur
les tables systèmes est interdite.
Correction avec dbcc checkcatalog "fixall"
dbcc checkcatalog
suggère plus haut de lancer la commande DBCC
CHECKCATALOG(<db>, fix)
, or dans ce cas précis c’est bien l’option
"fixall
" qu’il faut lancer pour corriger ce type d’inconsistence après avoir
mis en mode "single user
" la base de données concernée :
use master go exec sp_dboption 'mir_nav','single user',true go use mir_nav go checkpoint go dbcc checkcatalog ('mir_nav','fixall') go
Checking mir_nav: Logical pagesize is 2048 bytes Msg 15052, Level 16, State 4 Server 'TST_T2_ASE', Line 1 Index error: Table id 8, indid 0 calculated maxlen 273 does not match value 2000 in Sysindexes. Fixing above 1 errors found in index 0 for table 8. Msg 15052, Level 16, State 4 Server 'TST_T2_ASE', Line 1 Index error: Table id 14, indid 0 calculated maxlen 2 does not match value 0 in Sysindexes. Msg 15052, Level 16, State 5 Server 'TST_T2_ASE', Line 1 Index error: Table id 14, indid 0 calculated minlen 2 does not match value 0 in Sysindexes. Fixing above 2 errors found in index 0 for table 14. The following segments have been defined for database 34 (database name mir_nav). virtual device number virtual start addr size (logical pages) segments --------------------- -------------------- ---------------------- -------------------- 86 256000 153600 2 85 2048000 256000 0 1 85 0 1024000 0 1 86 0 256000 2 85 1024000 512000 0 1 85 1536000 512000 0 1 DBCC execution completed. If DBCC printed error messages, contact a user with System Administrator (SA) role.
La correction effective des erreurs apparaît avec le libellé : Fixing above
<n> errors found
Après correction et vérification, la base de données concernée peut être remise en mode multi user.
use master
go
exec sp_dboption 'mir_nav','single user','false'
go
use mir_nav
go
checkpoint
go