Health Monitor Check comme les autres fonctions d’Oracle Diagnostic Repository (ADR) stocke ses données dans les fichiers situés dans $ORACLE_BASE/diag/rdbms/<db_name>/$ORACLE_SID/metadata
. Cela permet notamment d’interroger le référentiel, y compris
- l’instance est en mode
NOMOUNT
depuis les vuesV$
- l’instance lorsque celle-ci est arrêtée depuis
ADRCI
.
Cet article illustre ce fonctionnement
Exécuter Health Monitor Check
Pour commencer, lancez une exécution de Health Check Monitor lorsque la base de données est ouverte. Peu importe le résultat d’ailleurs :
exec dbms_hm.run_check('Dictionary Integrity Check','&&vcheck')
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='&&vcheck';
NAME CHECK_NAME STATUS
------- ---------------------------- ----------
demo1 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='&&vcheck';
no rows selected
select name, check_name
from v$hm_run;
NAME CHECK_NAME
------- ----------------------------
demo1 Dictionary Integrity Check
exit;
Accéder aux données base fermée
Pour vérifier que c’est bien le cas, nous allons redémarrer l’instance en mode nomount :
startup force nomount
select p.spid
from v$process p, v$session s
where s.paddr=p.addr
and s.sid=sys_context('userenv','sid');
SPID
------------------------
11509
Dans un autre terminal, lancez strace
avec le PID du processus serveur :
cd /tmp
strace -osqlplus.out -p 11509
Puis lancez votre requête :
set pages 1000
select name from v$hm_run;
NAME
---------
demo1
Vous pouvez vérifier que le fichier est ouvert par le processus serveur en ouvrant le fichier généré par strace
:
grep open sqlplus.out |grep HM_RUN
open("/u01/app/oracle/diag/rdbms/white/WHITE/metadata/HM_RUN.ams", O_RDONLY|O_LARGEFILE) = 11
open("/u01/app/oracle/diag/rdbms/white/WHITE/metadata/HM_RUN.ams", O_RDONLY|O_DIRECT|O_LARGEFILE) = 11
open("/u01/app/oracle/diag/rdbms/white/WHITE/metadata/HM_RUN.ams", O_RDONLY|O_DSYNC|O_DIRECT|O_LARGEFILE) = 11
Supprimer le contenu de HM_RUN.ams
Conséquence de ce mode de fonctionnement, vous ne pourrez pas supprimer les informations d’exécution par d’autre moyen que la commande adrci
(à moins de supprimer les fichiers ams avec un rm
évidemment !). Voici un exemple d’utilisation ci-dessous :
adrci
ADRCI: Release 11.2.0.2.0 - Production on Mon Jun 20 17:21:35 2011
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
ADR base = "/u01/app/oracle"
show hm_run
ADR Home = /u01/app/oracle/diag/rdbms/white/WHITE:
*************************************************************************
**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 661
RUN_NAME demo1
CHECK_NAME Dictionary Integrity Check
NAME_ID 24
MODE 0
START_TIME 2011-06-20 15:18:26.296460 +02:00
RESUME_TIME <null>
END_TIME 2011-06-20 15:18:27.107890 +02:00
MODIFIED_TIME 2011-06-20 15:18:27.107890 +02:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <null>
1 rows fetched
help purge
Usage: PURGE [[-i| ] |
[-age[-type ALERT|INCIDENT|TRACE|CDUMP|HM|UTSCDMP]]]:
Purpose: Purge the diagnostic data in the current ADR home. If no
option is specified, the default purging policy will be used.
Options:
[-i id1 | id1 id2]: Users can input a single incident ID, or a
range of incidents to purge.
[-age]: Users can specify the purging policy either to all
the diagnostic data or the specified type. The data older than
ago will be purged
[-type ALERT|INCIDENT|TRACE|CDUMP|HM|UTSCDMP]: Users can specify what type of
data to be purged.
Examples:
purge
purge -i 123 456
purge -age 60 -type incident
purge -age 0 -type hm
show hm_run
ADR Home = /u01/app/oracle/diag/rdbms/white/WHITE:
*************************************************************************
0 rows fetched
Comme vous vous en rendrez compte, les informations disparaissent alors de V$HM_RUN
:
sqlplus / as sysdba
select count(*) from v$hm_run;
COUNT(*)
----------
0
Et ensuite…
Redémarrez l’instance et ouvrez la base de données :
startup force