Démonstrations de Health Monitor Check

Health Monitor Check est le framework de vérification des bases de données Oracle 11g. Il permet de valider toutes les corruptions possibles :

  • des fichiers de la base de données
  • des blocs de la base de données
  • des fichiers de contrôle
  • des undo tablespaces (ou d’une transaction dans les undo)
  • des redologs et archivelogs
  • du dictionnaire de données
  • des structures de gestion de l’espace d’ASM

Il y a plusieurs manière d’utiliser Health Monitor Check :

  • de manière automatique, sur certain type d’erreurs, Oracle lance automatiquement des vérifications
  • depuis la console Enterprise Manager
  • depuis le package DBMS_HM

Vous pouvez visualiser les résultats de via ADRCI et lancer les commandes base de données ouverte (online check) ou, pour certains contrôles également base de données fermée (offline check en mode nomount). Cet article présente quelques exemples d’utilisation d’Oracle Health Monitor…

Liste des contrôles disponibles

La requête ci-dessous liste l’ensemble des contrôles Health Monitor disponible en version 11.2.0.2. Ceux décrit dans la documentation sont les contrôles de type internal_check=Y :

set tab off
set lines 120
col name format a28
col description format a50 wor wra

select name,
cls_name class,
internal_check,
offline_capable,
description
from v$hm_check
order by internal_check, class;

NAME CLASS I O DESCRIPTION
----------------------------- --------------- - - ---------------------------------------------
ASM Allocation Check ASM N Y Diagnose allocation failure
DB Structure Integrity Check PERSISTENT_DATA N Y Checks integrity of all database files
CF Block Integrity Check PERSISTENT_DATA N Y Checks integrity of a control file block
Data Block Integrity Check PERSISTENT_DATA N Y Checks integrity of a data file block
Redo Integrity Check PERSISTENT_DATA N Y Checks integrity of redo log content
Dictionary Integrity Check PERSISTENT_DATA N N Checks dictionary integrity
Transaction Integrity Check PERSISTENT_DATA N N Checks a transaction for corruptions
Undo Segment Integrity Check PERSISTENT_DATA N N Checks integrity of an undo segment
ASM Disk Visibility Check ASM Y Y Diagnose add disk failure
ASM File Busy Check ASM Y Y Diagnose file drop failure
ASM Mount Check ASM Y Y Diagnose mount failure
HM Test Check GENERIC Y Y Check for health monitor functionality
No Mount CF Check PERSISTENT_DATA Y Y Checks control file in NOMOUNT mode
Tablespace Check Check PERSISTENT_DATA Y Y Checks a tablespace
Log Group Check PERSISTENT_DATA Y Y Checks all members of a log group
Log Group Member Check PERSISTENT_DATA Y Y Checks a particular member of a log group
Archived Log Check PERSISTENT_DATA Y Y Checks an archived log
Redo Revalidation Check PERSISTENT_DATA Y Y Checks redo log content
IO Revalidation Check PERSISTENT_DATA Y Y Checks file accessibility
Block IO Revalidation Check PERSISTENT_DATA Y Y Checks file accessibility
Txn Revalidation Check PERSISTENT_DATA Y N Revalidate corrupted transaction
Failure Simulation Check PERSISTENT_DATA Y Y Creates dummy failures
Logical Block Check PERSISTENT_DATA Y N Checks logical content of a block
CF Member Check PERSISTENT_DATA Y Y Checks a multiplexed copy of the control file
Mount CF Check PERSISTENT_DATA Y Y Checks control file in mount mode
All Datafiles Check PERSISTENT_DATA Y Y Checks all datafiles in the database
Single Datafile Check PERSISTENT_DATA Y Y Checks a data file

Chaque contrôle utilise des paramètres spécifiques que vous pouvez retrouver dans la documentation ou dans la vue v$hm_check_param comme ci-dessous :

col name format a15
col description format a30
select p.name, p.description
from v$hm_check_param p, v$hm_check c
where p.check_id=c.id
and c.name='Data Block Integrity Check';

NAME DESCRIPTION
--------------- -------------
BLC_DF_NUM File number
BLC_BL_NUM Block number

Corruption du dictionnaire de données

Pour les besoins de notre exemple, nous allons corrompre volontairement le dictionnaire de données; pour cela, nous allons créer une table et la supprimer des tables SYS.tab$ mais la laisser dans SYS.obj$ et SYS.col$ ; connecté sous l’utilisateur SYS, lancez le script ci-dessous :

create user demo
identified by demo
default tablespace users
temporary tablespace temp;

create table demo.t1(id number);

col object_name format a10
col object_id format 999999999 new_value objid
select object_id, object_name
from dba_objects
where OWNER='DEMO' and object_name='T1';

OBJECT_ID OBJECT_NAM
--------- ----------
74483 T1


delete from tab$ where obj#=&&objid;
commit;
startup force;

desc demo.t1;
ERROR:
ORA-03113: end-of-file on communication channel
Process ID: 4422
Session ID: 191 Serial number: 3

Utilisation du package DBMS_HM

Nous allons utiliser DBMS_HM pour détecter le problème :

connect / as sysdba

exec dbms_hm.run_check('Dictionary Integrity Check','check-1')

Si le schéma APEX_030200 est installé dans votre base de données, il se peut que l’assistant échoue avec l’erreur

*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01427: single-row subquery returns more than one row
ORA-06512: at "SYS.DBMS_HM", line 191
ORA-06512: at line 1

; c’est semble-il, d’après la trace 10046, un bug lié au fait que la requête select 134, rowid, 'icoldep$ pk' from ICOLDEP$ where 1 > (select obj#||','||intcol# from ICOLDEP$ group by obj#||','||intcol# having count(*) > 1) ramène plusieurs lignes. J’ai simplement supprimé le schéma, les synonymes publics et les objets du dictionnaire de données qui le référencent. Cela dit, vous pouvez aussi ouvrir une SR !

Vous pouvez ensuite visualiser l’exécution

set tab off
col name format a7
col check_name format a28
col status format a10
set lines 80
select name, check_name, status from v$hm_run
where name='check-1';

NAME CHECK_NAME STATUS
------- ---------------------------- ----------
check-1 Dictionary Integrity Check COMPLETED


select f.description, f.damage_description
from v$hm_finding f, v$hm_run r
where f.run_id=r.run_id
and r.name='check-1';

DESCRIPTION
--------------------------------------------------------------------------------
DAMAGE_DESCRIPTION
--------------------------------------------------------------------------------
SQL dictionary health check: obj$ ref to tab$ 50 on object OBJ$ failed
Damaged rowid is AAAAASAABAAAVCIAAb - description: Object Name T1 is referenced

Dans ce cas, v$hm_recommendation est vide ; il faut corriger les erreurs à la main avec le script ci-dessous :

delete from obj$ where obj#=&&objid;
commit;

Pour détecter la seconde erreur, il faut relancer Health Monitor :

exec dbms_hm.run_check('Dictionary Integrity Check','check-2')

set tab off
col name format a7
col check_name format a28
col status format a10
set lines 80
select name, check_name, status from v$hm_run
where name='check-2';

NAME CHECK_NAME STATUS
------- ---------------------------- ----------
check-2 Dictionary Integrity Check COMPLETED


set lines 100
select f.description, f.damage_description
from v$hm_finding f, v$hm_run r
where f.run_id=r.run_id
and r.name='check-2';

DESCRIPTION
------------------------------------------------------------------------------------------
DAMAGE_DESCRIPTION
------------------------------------------------------------------------------------------
SQL dictionary health check: col$.obj# fk(obj$) 65 on object COL$ failed
Damaged rowid is AAAAACAABAAAT5fAAF - description: No further damage description available

SQL dictionary health check: deferred_stg$.obj# fk 148 on object DEFERRED_STG$ failed
Damaged rowid is AAAACEAABAAATs0AAA - description: No further damage description available


delete from deferred_stg$ where obj#=&&objid;
delete from col$ where obj#=&&objid;
commit;

La prochaine exécution ne remonte plus d’erreur :

startup force;
drop user demo cascade;

Health Monitor Check et ADRCI

Il n’est pas possible d’exécuter Health Monitor directement depuis ADRCI; en revanche, vous pouvez tout à fait visualiser les exécutions précédentes et générer des rapports associés comme le montre le script ci-dessous :

adrci> show hm_run -p "run_name='check-2'"

ADR Home = /u01/app/oracle/diag/rdbms/black/BLACK:
*************************************************************************

**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 1581
RUN_NAME check-2
CHECK_NAME Dictionary Integrity Check
NAME_ID 24
MODE 0
START_TIME 2011-06-04 12:01:01.490200 +02:00
RESUME_TIME <NULL>
END_TIME 2011-06-04 12:01:03.356193 +02:00
MODIFIED_TIME 2011-06-04 12:01:03.356193 +02:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
1 rows fetched

adrci <<EOF
set echo off
set termout off
spool greg.xml
create report hm_run check-2
show report hm_run check-2
exit
EOF

head -n 3 greg.xml
<?xml version="1.0" encoding="US-ASCII"?>
<HM-REPORT REPORT_ID="check-2">
<TITLE>HM Report: check-2</TITLE>

Heath Monitor en mode Off-Line

Dans cette dernière section, vous verrez comment utiliser Health Check Monitor en mode Offline; Pour cela, démarrer la base de données en mode nomount et utilisez simplement le package DBMS_HM :

startup force nomount;

exec dbms_hm.run_check('DB Structure Integrity Check', 'test36');

select name, check_name
from v$hm_run
order by start_time;

col name format a7

NAME CHECK_NAME
------- --------------------------------
check-1 Dictionary Integrity Check
check-2 Dictionary Integrity Check
check-3 Dictionary Integrity Check
test36 DB Structure Integrity Check


var rep clob

exec :rep:=dbms_hm.get_run_report('test36')

set long 10000
set longchunksize 10000
set lines 120
set pages 1000
print rep

REP
-----------------------------------------------------------------
Basic Run Information
Run Name : test36
Run Id : 1641
Check Name : DB Structure Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2011-06-04 12:27:27.219448 +02:00
End Time : 2011-06-04 12:27:27.272029 +02:00
Error Encountered : 0
Source Incident Id : 0
Number of Incidents Created : 0

Input Paramters for the Run
Run Findings And Recommendations

Note:
Si vous cherchez à savoir, les données des différentes exécutions de Health Monitor Check, sont disponibles dans les fichiers binaires $ORACLE_BASE/diag/rdbms/<db_name>/$ORACLE_SID/metadata/HM_*.ams

Références

Pour en savoir plus sur Health Monitor Check, regardez :