
Health Monitor - 日本エクセム株式会社 Oracle 技術情報
基本情報
Oracleは11gでHealth Monitorという診断frameworkを実装しました。このHealth Monitorは、複数layerとcomponentで構成されており、主にphysical&logical block curruption、undo&redo corruption、data dictionary corruptionなどの診断機能を実行します。このHealth Monitorは、二つの方法で行うことが可能です。
・Reactive:深刻なエラーが発生した場合Fault DiagnosabilityがHealth Monitorを自動的に実行します。
・Manual:DBAがDBMS_HMというパッケージを利用して駆動させることができます。
この時、目的の項目についてチェックが可能です。
また、Health Monitorは、DBの状態に応じて、二つのモードで実行されます。
Health Monitorエントリ
Health Monitorの項目は、v$ hm_checkを実行してみる事で確認できます。
SQL>SELECT * FROM v$hm_check
ID NAME CLSID CLS_NAME FLAGS INTERNAL_CHECK OFFLINE _CAPABLE
DESCRIPTION
--- ----------------------------- ------ --------------- ------ --------------- -----------------
0 0 UNKNOWN 1 Y N
1 HM Test Check 1 GENERIC 35 Y Y
Check for HM Functionality
2 DB Structure Integrity Check 2 PERSISTENT_DATA 2 N Y
Checks integrity of all database files
3 Data Block Integrity Check 2 PERSISTENT_DATA 2 N Y
Checks integrity of a datafile block
4 Redo Integrity Check 2 PERSISTENT_DATA 2 N Y
Checks integrity of redo log content
5 Logical Block Check 2 PERSISTENT_DATA 1 Y N
Checks logical content of a block
10 Transaction Integrity Check 2 PERSISTENT_DATA 0 N N
Checks a transaction for corruptions
11 Undo Segment Integrity Check 2 PERSISTENT_DATA 0 N N
Checks integrity of an undo segment
12 All Control Files Check 2 PERSISTENT_DATA 19 Y Y
Checks all control files in the database
13 CF Member Check 2 PERSISTENT_DATA 19 Y Y
Checks a multiplexed copy of the control file
14 All Datafiles Check 2 PERSISTENT_DATA 19 Y Y
Check for all datafiles in the database
15 Single Datafile Check 2 PERSISTENT_DATA 19 Y Y
Checks a datafile
16 Log Group Check 2 PERSISTENT_DATA 19 Y Y
Checks all members of a log group
17 Log Group Member Check 2 PERSISTENT_DATA 19 Y Y
Checks a particular member of a log group
18 Archived Log Check 2 PERSISTENT_DATA 19 Y Y
Checks an archived log
19 Redo Revalidation Check 2 PERSISTENT_DATA 19 Y Y
Checks redo log content
20 IO Revalidation Check 2 PERSISTENT_DATA 19 Y Y
Checks file accessability
21 Block IO Revalidation Check 2 PERSISTENT_DATA 19 Y Y
Checks file accessability
22 Txn Revalidation Check 2 PERSISTENT_DATA 17 Y N
Revalidate corrupted txn
23 Failure Simulation Check 2 PERSISTENT_DATA 35 Y Y
Creates dummy failures
24 Dictionary Integrity Check 2 PERSISTENT_DATA 0 N N
Checks dictionary integrity
しかし、二重、実際にHealth Monitorの項目で使用可能なのは、Internal_checkがNであるものである。
・DB Structure Integrity Check:DBがonline状態のcontrol fileに記録されているlog file、data fileを
チェックして、nomount状態であればcontrol fileを確認して、
問題の発生の有無をチェックします。
・Data Block Integrity Check:V $ database_block_corruptionビューを参照して、ブロックのチェックサム、
head / tail mismatch、論理の整合性などをチェックして、問題が発生した場合
Block Media Recoveryを実行します。しかし、これは、ブロック単位でのみ
実行され、ブロック間、あるいはセグメント間のcorruptionについて
チェックが不可能です。
・Redo Integrity Check:Archive logとredo logをチェックします。
・Undo Segment Integrity Check:logical undo corruptionをチェックして、もしcorruptionが発見されると、
PMONとSMONが、これを回復します。しかし、回復さえも失敗した場合
Health MonotorはV $ corrupt_xid_listを参照して、情報を記録し、
そのトランザクションを強制的にcommitします。
・Transaction Integrity Check:これはUndo Segment Integrity Checkとは異なり、特定の個々のトランザクション
にのみ動作します。
・Dictionary Integrity Check:コアとなるいくつかのDictionary objectのチェックを実行します。
対象となるobjectはtab $、clu $、fet $、uet $、seg $、undo $、ts $、
file $、obj $、ind $、icol $、col $、user $、con $、cdef $、 ccol $、
bootstrap $、objauth $、ugroup $、tsq $、syn $、view $、typed_view $、
superobj $、seq $、lob $、coltype $、subcoltype $、ntab $、refcon $、
opqtype $、dependency $ 、access $、viewconf $、icoldep $、dual $、
sysauth $、objpriv $、defrole $、ecol $です。
チェックする項目は、各dictionary objectのdictionary entry、
logical constrainsのcross-row level check、dictionary間parent-childに
関するobject relationshipなどです。
Health Monitorの実行
Health MonitorはDBMS_HMというパッケージを使用して実行が可能です。上記6つの項目について下記のように実行することができます。
SQL>begin
SQL>DBMS_HM.RUN_CHECK('DB Structure Integrity Check', 'HMTest');
SQL>end;
PL/SQL procedure successfully completed
run_checkプロシージャの引数は、二つ必要ですが最初の引数はMonitorする項目の名前で、これは正確に記述してなければなりません。そして第2引数は、そのHealth Monitorの名前で、これにより、レポートやHMアイテムを閲覧することができます。
また、Transaction Integrity Checkの項目については、特定のパラメータが引数として提供され、これに対する情報は次のSQLを使用して参照することができます。
L>SELECT c.name check_name, p.name parameter_name, p.type,
SQL>p.default_value, p.description
SQL>FROM v$hm_check_param p, v$hm_check c
SQL>WHERE p.check_id = c.id and c.internal_check = 'N'
SQL>ORDER BY c.name
CHECK_NAME PARAMETER_NAME TYPE DEFAULT_VALUE
DESCRIPTION
----------------------------- -------------- -------------------- ---------------
Data Block Integrity Check BLC_DF_NUM DBKH_PARAM_UB4
Block Data File number
Data Block Integrity Check BLC_BL_NUM DBKH_PARAM_UB4
Datablock number
Dictionary Integrity Check CHECK_MASK DBKH_PARAM_TEXT ALL
Check Mask
Dictionary Integrity Check TABLE_NAME DBKH_PARAM_TEXT ALL_CORE_TABLES
Table Name
Redo Integrity Check SCN_TEXT DBKH_PARAM_TEXT 0
SCN of the latest good redo (if known)
Transaction Integrity Check TXN_ID DBKH_PARAM_TEXT
Transaction ID
Undo Segment Integrity Check USN NUMBER DBKH_PARAM_TEXT
Undo Segment Number
このような場合は、下記のように実行が可能です。
BEGIN
DBMS_HM.RUN_CHECK (
check_name => 'Transaction Integrity Check',
run_name => 'my_run',
input_params => 'TXN_ID=7.33.2');
END;
Health Monitor情報の閲覧
Health Monitorの情報は、実行されたMonitorとこれにより生成されたReportの二つに分けて見ることができます。まず実行されるMonitorの情報を調べる方法は、以下の通りです。
SQL>select run_id, name, check_name, run_mode, status, error_number
SQL> from v$hm_run
RUN_ID NAME CHECK_NAME RUN_MODE STATUS ERROR_NUMBER
------ ---------- -------------------------------- -------- ----------- ------------
21 test_hm DB Structure Integrity Check MANUAL COMPLETED 0
61 HMTest DB Structure Integrity Check MANUAL COMPLETED 0
1 my_run Dictionary Integrity Check MANUAL COMPLETED 0
Reportを表示する方法には、大きく二つがあり、一つは、DBMS_HMパッケージを利用する方法であり、他の一つは、ADRCIを利用する方法となります。次はDBMS_HMを利用する方法です。
SQL>SELECT DBMS_HM.GET_RUN_REPORT('HMTest') FROM DUAL;
Basic Run Information
Run Name : HMTest
Run Id : 1
Check Name : Dictionary Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2007-10-22 19:22:48.005957 +09:00
End Time : 2007-10-22 19:22:53.119586 +09:00
Error Encountered : 0
Source Incident Id : 0
Number of Incidents Created : 0
Input Paramters for the Run
TABLE_NAME=ALL_CORE_TABLES
CHECK_MASK=ALL
Run Findings And Recommendations
Finding
Finding Name : Dictionary Inconsistency
Finding ID : 2
Type : FAILURE
Status : OPEN
Priority : CRITICAL
Message : SQL dictionary health check: dependency$.dobj# fk 126 on
object DEPENDENCY$ failed
Message : Damaged rowid is AAAABnAABAAAOiHABI - description: No further
damage description available
Finding
Finding Name : Dictionary Inconsistency
Finding ID : 5
Type : FAILURE
Status : OPEN
Priority : CRITICAL
Message : SQL dictionary health check: dependency$.dobj# fk 126 on
object DEPENDENCY$ failed
Message : Damaged rowid is AAAABnAABAAAQXqAA6 - description: No further
damage description available
以下は、ADRCIを利用する方法です。ADRCIを使用すると、reportは、XMLの形で表示されます。reportを表示するには、以下のようCreateをした後にShowをしなければなりません。
adrci> show report hm_run HMTest
HM Report: HMTest
Dictionary Integrity Check
1
HMTest
MANUAL
COMPLETED
0
0
0
2007-10-22 19:22:48.005957 +09:00
2007-10-22 19:22:53.119586 +09:00
TABLE_NAME=ALL_CORE_TABLES
CHECK_MASK=ALL
Dictionary Inconsistency
2
FAILURE
OPEN
CRITICAL
0
2007-10-22 19:22:52.522125 +09:00
SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed
Damaged rowid is AAAABnAABAAAOiHABI - description: No further damage description
available
Dictionary Inconsistency
5
FAILURE
OPEN
CRITICAL
0
2007-10-22 19:22:52.536997 +09:00
SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed
Damaged rowid is AAAABnAABAAAQXqAA6 - description: No further damage description
available
これらのレポートのfindingに該当する情報は、v$ hm_findingというビューを介して提供されます。
SQL>SELECT finding_id, priority, type, description FROM v$hm_finding WHERE run_id = 1
FINDING_ID PRIORITY TYPE DESCRIPTION
---------- -------- -------- ----------------------------------------
2 CRITICAL FAILURE SQL dictionary health check: dependency$ failed
5 CRITICAL FAILURE SQL dictionary health check: dependency$ failed