Health Monitor
EXEM Knowledge Base
오라클은 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