Sybase ASE 12.5.2, améliorations de la commande dbcc checkcatalog (options fix, all et fixall)

Logo

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