Health Monitor

EXEM Knowledge Base

Jump to: navigation, 찾기

오라클은 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의 상태에 따라 두가지 모드로 수행된다.

* DB-Online Mode : DB가 mount나 Open된 상태에서 수행하는 것으로 모든 상태의 Health Monitor가 가능
* DB-Offline Mode : DB가 Nomount 상태에서 수행하는 것으로 Redo Integrity Check와 the DB Structure Integrity Check만 가능

[편집] 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의 수행

Helath 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할 항목의 이름으로 이는 정확하게 기술해 주어야 한다. 그리고 두번째 인수는 해당 Health Monitor의 이름으로 이를 통해 보고서나 HM항목을 열람할 수 있다.

또한 Transaction Integrity Check와 같은 항목에 대해서는 특정 파라메터가 인수로 제공되어아 햐는데 이에 대한 정보는 아래의 SQL을 통해 찾아볼 수 있다.

SQL>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
<?xml version="1.0" encoding="US-ASCII"?>
<HM-REPORT REPORT_ID="HMTest">
    <TITLE>HM Report: HMTest</TITLE>
    <RUN_INFO>
        <CHECK_NAME>Dictionary Integrity Check</CHECK_NAME>
        <RUN_ID>1</RUN_ID>
        <RUN_NAME>HMTest</RUN_NAME>
        <RUN_MODE>MANUAL</RUN_MODE>
        <RUN_STATUS>COMPLETED</RUN_STATUS>
        <RUN_ERROR_NUM>0</RUN_ERROR_NUM>
        <SOURCE_INCIDENT_ID>0</SOURCE_INCIDENT_ID>
        <NUM_INCIDENTS_CREATED>0</NUM_INCIDENTS_CREATED>
        <RUN_START_TIME>2007-10-22 19:22:48.005957 +09:00</RUN_START_TIME>
        <RUN_END_TIME>2007-10-22 19:22:53.119586 +09:00</RUN_END_TIME>
    </RUN_INFO>
    <RUN_PARAMETERS>
        <RUN_PARAMETER>TABLE_NAME=ALL_CORE_TABLES</RUN_PARAMETER>
        <RUN_PARAMETER>CHECK_MASK=ALL</RUN_PARAMETER>
    </RUN_PARAMETERS>
    <RUN-FINDINGS>
        <FINDING>
            <FINDING_NAME>Dictionary Inconsistency</FINDING_NAME>
            <FINDING_ID>2</FINDING_ID>
            <FINDING_TYPE>FAILURE</FINDING_TYPE>
            <FINDING_STATUS>OPEN</FINDING_STATUS>
            <FINDING_PRIORITY>CRITICAL</FINDING_PRIORITY>
            <FINDING_CHILD_COUNT>0</FINDING_CHILD_COUNT>
            <FINDING_CREATION_TIME>2007-10-22 19:22:52.522125 +09:00</FINDING_CREATION_TIME>
            <FINDING_MESSAGE>SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed</FINDING_MESSAGE>
            <FINDING_MESSAGE>Damaged rowid is AAAABnAABAAAOiHABI - description: No further damage description available</FINDING_MESSAGE>
        </FINDING>
        <FINDING>
            <FINDING_NAME>Dictionary Inconsistency</FINDING_NAME>
            <FINDING_ID>5</FINDING_ID>
            <FINDING_TYPE>FAILURE</FINDING_TYPE>
            <FINDING_STATUS>OPEN</FINDING_STATUS>
            <FINDING_PRIORITY>CRITICAL</FINDING_PRIORITY>
            <FINDING_CHILD_COUNT>0</FINDING_CHILD_COUNT>
            <FINDING_CREATION_TIME>2007-10-22 19:22:52.536997 +09:00</FINDING_CREATION_TIME>
            <FINDING_MESSAGE>SQL dictionary health check: dependency$.dobj# fk 126 on object DEPENDENCY$ failed</FINDING_MESSAGE>
            <FINDING_MESSAGE>Damaged rowid is AAAABnAABAAAQXqAA6 - description: No further damage description available</FINDING_MESSAGE>
        </FINDING>
    </RUN-FINDINGS>
</HM-REPORT>

이러한 보고서의 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