2018.06.27
Health Monitor
目次
Health Monitor概要
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