Wednesday, March 30, 2011

Health Monitor

A nova feature do Oracle Health Monitor examina diversos componentes do banco, detecta corrupção, blocos fisicamente e logicamente corrompidos, corrupção do dicionário, entre outras.
Health Monitor procura por diversos erros e pode indicar recomendações, o Health Monitor pode ser executado de forma reativa, quando houver algum problema na base o Oracle automaticamente executa o algum tipo de checagem ou manualmente, através de comandos emitidos pelo DBA.

Há dois metodos para execução do Health Check, DB-online e DB-offline. Todos os tipos de checagem podem ser feitas com o banco on line, exceto Redo Integrity Check e DB Structure Check podem ser usados com o banco off line.

Tipos de Health Check:

DB Structure Integrity Check - Verifica os arquivos do bancos e lista se inacessiveis, corrupção ou incosistente.

Data Block Integrity Check - Checa blocos do banco, quando encontrado blocos com corrupção é refletido na view V$DATABASE_BLOCK_CORRUPTION e pode ser recupedo pelo Block Media Recover.

Redo Integrity Check — Checa redo logs e archives (quando disponiveis), se estão acessiveis ou corruptos.

Undo Segment Integrity - Checa logicamente a undo por corrupções, quando encontrada o banco tenta automaticamente através do pmon e smon recuperar a transação, é refletido na view V$CORRUPT_XID_LIST. A maioria deste tipo de problema pode ser solicitado através de commit ou rollback.

Transaction Integrity Check - Semelhante a Undo Segment Integrity, porém apenas realiza a checagem.

Dictionary Integrity Check - Verifica a integridade do dicionário de dados.

Executando o Health Check manualmente.


O Heath Check é executado através da package DBMS_HM e aceita parametros que podem ser listados pelo seguinte select:

SET LINESIZE 120
COLUMN check_name FORMAT A30
COLUMN parameter_name FORMAT A15
COLUMN type FORMAT A15
COLUMN default_value FORMAT A15
COLUMN description FORMAT A40

SELECT c.name check_name, p.name parameter_name, p.type, p.default_value, p.description
FROM v$hm_check_param p, v$hm_check c
WHERE p.check_id = c.id
AND c.internal_check = 'N'
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


Podemos realizar um health check, como procurar por estruturas danificados no banco através da instrução, onde my_test_run é o nome do HC

BEGIN
DBMS_HM.run_check (
check_name => 'DB Structure Integrity Check',
run_name => 'my_test_run');
END;
/



Exibindo erros encontrados pelo Health Check.

Além de serem populados em dicionários e views dinámicas do dicionário, os problemas encontrados pelo Health Check são gravado dentro da arquitetura de diagnostico da Oracle, Diag, e podem ser acessado através da ferramentas:

- Pela função DBMS_HM.GET_RUN_REPORT;
- Pelo comando list failures do RMAN;
- Realizando consultas nas views V$HM_RUN, V$HM_FINDING, and V$HM_RECOMMENDATION;
- Pelo Enterprise Manager;
- Pelo repositório de diagnóstico ( ADRCI ).

Exemplo

- RMAN

RMAN> list failure;

List of Database Failures
=========================

Failure ID Priority Status Time Detected Summary
---------- -------- --------- ------------- -------
302 HIGH OPEN 30-MAR-11 One or more non-system datafiles are
missing


- DBMS_HM

SQL> BEGIN
2 DBMS_HM.run_check (
3 check_name => 'DB Structure Integrity Check',
4 run_name => 'my_test_run');
5 END;
6 /

PL/SQL procedure successfully completed.

SQL>
SQL> SET LONG 100000
SQL> SET LONGCHUNKSIZE 1000
SQL> SET PAGESIZE 1000
SQL> SET LINESIZE 512
SQL> SELECT DBMS_HM.get_run_report('MY_TEST_RUN') FROM dual;

DBMS_HM.GET_RUN_REPORT('MY_TEST_RUN')
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------
Basic Run Information
Run Name : my_test_run
Run Id : 1079
Check Name : DB Structure Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2011-03-30 19:36:02.812000 -03:00
End Time : 2011-03-30 19:36:03.296000 -03:00
Error Encountered : 0
Source Incident Id : 0
Number of Incidents Created : 0

Input Paramters for the Run
Run Findings And Recommendations
Finding
Finding Name : Missing datafile
Finding ID : 1083
Type : FAILURE
Status : OPEN
Priority : HIGH
Message : Datafile 4: 'C:\APP\DHNOMURA\ORADATA\SRVDB11\DATAFILE\O1_MF_U
SERS_6S76FLKL_.DBF' is missing
Message : Some objects in tablespace USERS might be unavailable

No comments: