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 :