Homogénéité des bases de données ASE - Commandes DBCC

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 dans systypes
  • vérifie que le dernier checkpoint dans la table syslogs 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'allocations
  • fast : rapport ne mentionnant que les pages qui sont référencées mais non allouées
  • NULL : utilise l'option par défaut (optimized)

Options de résolution :

  • fix : résout les erreurs d'allocation détectées par le vérificateur
  • nofix : 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'option fix)
  • 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)