Cas d'usage: Corruption d'un bloc Index

Un petit rappel d’informations sur les cas de corruption de blocs dans une base Oracle.
Les corruptions peuvent être de deux types, logiques ou physiques.
Les corruptions de blocs peuvent être causées par (liste non exhaustive) :
– Disques ou contrôleurs de disques en erreur
– Mémoire défectueuse
– Interface d’entrées/sorties défectueuse (par exemple contrôleur disque défectueux)
– Entrées/sorties OS incomplètes.
Dans le cas d’une corruption physique, la base de données ne reconnaît pas du tout le bloc : le « checksum » est invalide, le « header » et le « footer » du bloc ne correspondent pas et sont incompréhensibles pour le programme.
Dans le cas d’une corruption logique, le bloc est bien reconnu en tant bloc de base de données, mais le contenu est logiquement inconsistant, les informations ne correspondent pas à ce qu’elles devraient être.
Quand RMAN, au cours d’une sauvegarde ou d’une commande de validation, détecte une corruption logique, il laisse une trace dans le fichier alert.log et crée une entrée dans la vue v$database_block_corruption.
Cas d’usage simple, résoudre un bloc d’index corrompu :
1) Identification de l’objet impacté depuis la vue v$database_block_corruption :

SQL> SELECT DISTINCT owner, segment_name, segment_type
2 from v$database_block_corruption dbc JOIN dba_extents e ON dbc.file# = e.file_id AND dbc.block# BETWEEN e.block_id and e.block_id+e.blocks-1 ORDER BY 1,2;OWNER
------------------------------
SEGMENT_NAME
--------------------------------------------------------------------------------
SEGMENT_TYPE
------------------
BWP2P
IND_IL9_TEXT1_ADMINISTRATIVE_S
INDEX

Comme c’est un bloc d’index, l’opération de réparation va constituer en la reconstruction de l’index.
2) Reconstruction de l’index :

SQL> ALTER INDEX BWP2P.IND_IL9_TEXT1_ADMINISTRATIVE_S rebuild;
Index altered.

3) Vérification du block :

SQL> SELECT DISTINCT owner, segment_name, segment_type from v$database_block_corruption dbc JOIN dba_extents e ON dbc.file# = e.file_id AND dbc.block# BETWEEN e.block_id and e.block_id+e.blocks-1 ORDER BY 1,2;
no rows selected

Toutefois, vous verrez que la vue v$database_block_corruption contient toujours 1 ligne, qui fait référence à un bloc qui n’est plus utilisé.
Il vous faudra refaire une commande « validate » sous RMAN ou une sauvegarde pour mettre à jour la vue.
Ceci est un cas simple, mais la résolution n’est pas toujours aussi évidente, le support Oracle a cependant beaucoup travaillé sur le sujet pour vous aider…
et vous pouvez approfondir en utilisant la note MOS de référence 28814.1 : « Handling Oracle Block Corruptions » qui contient le traitement pour tous les cas possibles.
En espérant que cela vous aidera lors d’une prochaine corruption.