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