Introduction
Avant la sauvegarde d’une base de données, la consistence d’une base de
données doit être vérifiée. Ce document traite de l’utilisation des commandes
dbcc
pour vérifier et fixer la consistence d’une base de données.
Généralités sur les commandes dbcc
Inconsistence dans une base de données
Les tables et les indexes sont composés de chaînes de pages de 2K. Lorsqu’une page est allouée à un objet :
- le serveur enregistre l’information qu’une page est allouée à l’objet
- la page est ajoutée dans la chaîne de pages de l’objet
Les inconsistences peuvent se produire dans les allocations de pages aux objets.
Exemples :
- le serveur enregistre qu’une page est allouée à un objet mais la page ne fait pas partie du chaînage de page de l’objet, et vice-versa
- une page ne pointe pas correctement vers la page précédente ou suivante dans le chaînage
Causes possibles :
- échec hardware
- fluctuations de puissance
- recovery de base de données impropre.
Généralités sur les commandes dbcc
Le vérificateur de consistence des bases de données (Database Consistency
Checker, dbcc
) est un jeu de commandes utiles pour vérifier la consistence
physique et logique d’une base de données.
Les commandes qui vérifient le chaînage de pages pour les objets de bases de données sont :
dbcc checktable
dbcc checkdb
dbcc checkcatalog
Les commandes qui vérifient les allocations de pages pour les objets des bases de données sont :
dbcc tablealloc
dbcc indexalloc
dbcc checkalloc
Quand exécuter les commandes dbcc ?
Il est recommandé de vérifier l’homogénéité d’une base de données :
avant un dump d’une base de données
- si un message apparaît dans le fichier log du serveur, ce dernier indiquant une corruption de table
- si les requêtes se comportent anormalement
- comme outil de monitoring
La consistence des bases de données doit être vérifiée avec le moindre impact sur les utilisateurs (ressources, verrous), exécuter si possible les commandes lorsque l’usage du système est faible.
Si le système ne possède pas d’usages systèmes faibles, dans ce cas :
- dumper la base de données
- restaurer cette dernière vers un autre serveur
- exécuter les commandes
dbcc
sur cette copie de base de données - noter toutes les inconsistences détectées
- dans la base de données originale, exécuter seulement les commandes pour fixer les inconsistences trouvées dans la copie
Vérification du chaînage de pages
dbcc checktable
La commande dbcc checktable
s’exécute sur une table spécifique. Pour cette
table, la commande :
- vérifie le chaînage de pages pour s’assurer que les pointeurs vers les pages précédentes et suivantes sont homogènes pour la table
- s’assure que les clés d’indexes sont correctement ordonnées
- confirme que les pointeurs d’indexes de chaque page et ligne sont valides
- confirme que les lignes de données dans chaque page possèdent une entrée dans une table de row offset
Si le segment de log possède son propre device, la commande vérifie la table
syslogs
et rapporte l’usage de l’espace ainsi que le pourcentage d’espace libre.
Syntaxe :
dbcc checktable ( {table_name | table_id} [,skip_ncindex] )
dbcc checktable (sales)
Checking sales The total number of data pages in this table is 192. Table has 7065 data rows.
Il est possible d’accélérer l’exécution de la commande en écartant la
vérification sur les indexes non clusterisés avec l’option skip_ncindex
.
- la corruption sur les indexes non clusterisés est moins dommageable et sérieuse que la corruption sur les données elles-mêmes
- lors de l’utilisation de cette commande, les résultats sont identiques
dbcc checktable (sales, skip_ncindex)
Checking sales The total number of data pages in this table is 192. Table has 7065 data rows.
dbcc checkdb
Cette commande s’exécute sur une base de données, lorsque la base de données n’est pas spécifiée, la vérification est réalisée sur la base de données courante.
Pour une base de données, dbcc checkdb
exécute la commande dbcc checktable
sur toutes les tables de la base de données.
Si l’option skip_ncindex
est spécifiée, chaque index non clusterisé sur
chaque table sera écarté de la vérification.
Syntaxe :
dbcc checkdb [ (database_name [, skip_ncindex ] ) ]
dbcc checkdb (pubs2)
Checking pubs2 Checking sysobjects The total number of data pages in this table is 3. Table has 54 data rows. Checking sysindexes The total number of data pages in this table is 7. Table has 66 data rows. Checking syscolumns The total number of data pages in thîs table is 10. Table has 445 data rows. Checking systypes ...
dbcc checkcatalog
Si aucune base de données n’est spécifiée, la commande dbcc checkcatalog
s’exécute sur la base de données courante. La commande dbcc checkcatalog
vérifie les problèmes d’intégrité référentielle dans les tables systèmes de la
base de données
A titre d’exemple, la commande dbcc checkcatalog
- vérifie qu’une table ou une vue dans sysobjects possède au moins une
ligne dans la table
syscolumns
- vérifie qu’un type dans la table
syscolumns
possède une ligne danssystypes
- vérifie que le dernier
checkpoint
dans la tablesyslogs
est valide - vérifie les définitions des segments dans la table
sysegments
Syntaxe :
dbcc checkcatalog [(database_name)]
dbcc checkcatalog
Checking current database The following segments have been defined for database 6 (database name pubs2). virtual start addr size segments -------------------------------- 6148 1536 0 1 2
Vérification des allocations de pages
dbcc tablealloc
La commande dbcc tablealloc
s’exécute sur une table spécifique. Pour la
table, la commande dbcc tablealloc
- s’assure que toutes les pages de la table et de ses indexes sont correctement allouées
- s’assure que les pages allouées de la table ainsi que ses indexes font partie effectivement d’un chaînage de pages
Options de la commande dbcc tablealloc
Options de reporting :
optimized
: rapport basé sur les allocations de page listées dans la table OAM (option par défaut)full
: rapport listant tous les types d’erreurs d’allocationsfast
: rapport ne mentionnant que les pages qui sont référencées mais non allouéesNULL
: utilise l’option par défaut (optimized
)
Options de résolution :
fix
: résout les erreurs d’allocation détectées par le vérificateurnofix
: notification des erreurs sans résolution de ces dernières, cette option est l’option par défaut
Syntaxe
dbcc tablealloc ({table_name | table_id}, index_id [, {full | optimized | fast | NULL}
[, {fix | nofix} ]])
dbcc tablealloc (titles, optimized)
The default fix option of FIX is used for this TABLE: titles OBJID = 208003772 INDID=1 FIRST=848 ROOT=864 SORT=1 Data level:1. 2 Data pages and 2 Extents allocated. Indid :1. 1 Index pages and 2 Extents allocated. INDID=2 FIRST=872 ROOT=872 SORT=0 Indid :2. 1 Index pages and 2 Extents allocated. TOTAL # of extents = 6 Alloc page 768 (# of extent=2 used pgs=2 ref pgs=2) Alloc page 768 (# of extent=2 used pgs=3 ref pgs=3) Alloc page 512 (# of extent=1 used pgs=l ref pgs=l) Alloc page 768 (# of extent=1 used pgs=l ref pgs=l) Total (# of extent=6 used pages=7 ref pgs=7) in this database
dbcc indexalloc
La commande dbcc indexalloc
s’exécute sur un index en particulier. La
commande dbcc indexalloc
- s’assure que toutes les pages de l’index sont correctement allouées
- s’assure que toutes les pages de l’index font partie d’un chaînage de pages
La commande dbcc indexalloc
inclut les mêmes options que la commande dbcc
tablealloc
- rapport :
optimized
,full
,fast
,NULL
fix
:fix, nofix
Syntaxe:
dbcc indexalloc ({table_name | table_id}, index_id [, {full | optimized | fast | NULL}
[, {fix | nofix} ]])
dbcc indexalloc (authors, 1, full)
The default fix option of FIX is used for this run. TABLE: authors OBJID = 16003088 INDID=1 FIRST=760 ROOT=800 SORT=1 Data level:1. 1 Data pages and 2 Extents allocated. indid :1. 1 index pages and 2 Extents allocated. TOTAL # of extents = 4 Alloc page 512 (# of extent=2 used pgs=2 ref pgs=2) Alloc page 768 (# of extent=2 used pgs=2 ref pgs=2) Total (# of extent=4 used pages=4 ref pages=4) in thîs database
dbcc checkalloc
La commande dbcc checkalloc
s’exécute sur la base de données de courante si
aucune base de données n’est spécifiée. La commande dbcc checkalloc
réalise la
commande dbcc tablealloc
sur toutes les tables de la base de données. La
commande dbcc checkalloc
ne possède par d’options de reporting, en revanche les
options fix | nofix
sont disponibles.
Syntaxe :
dbcc checkalloc [ ( database_name [, fix | nofix ] ) ]
dbcc checkalloc (pubs2)
Checking pubs2 ************************************************* TABLE: sysobjects OBJID = 1 INDID=1 FIRST=l ROOT=8 SORT=O Data level:1. 3 Data pages and 1 Extents allocated. Indid :1. 1 Index pages and 1 Extents allocated. INDID=2 FIRST=16 ROOT=16 SORT=O Indid :2. 1 Index pages and 1 Extents allocated. TOTAL # of extents = 3 ...
Recommandations
Pour des performances accrues :
- utiliser la commande
dbcc checkalloc
pour localiser les erreurs (mais ne pas spécifier de résolution avec l’optionfix
) - utiliser la commande
dbcc tablealloc
au besoin pour résoudre les erreurs
Conserver également les enregistrements sur le temps mis par le serveur pour exécuter les commandes dbcc.
Suppression d’une base de données endommagée
Si une base de données possède des inconsistences, le serveur peut considérer la base de données corrompue.
Dans cette situation, la base de données ne peut être supprimée avec la
commande drop database
.
La base de données ne peut être supprimée qu’avec la commande dbcc
dbrepair
Syntaxe :
dbcc dbrepair (database_name, dropdb)
dbcc dbrepair (pubs2, dropdb)