Neste post abordaremos o uso da package DMBS_HM para checar a Saúde do banco de dados Oracle.
A package DMBS_HM foi introduzida na versão 11g do Oracle Database, ela permite examinar várias camadas e componentes do banco de dados. Com ela é possível detectar corrupções de DATAFILES, corrupções de “blocos lógicos e físicos”, corrupção de segmentos de UNDO ou de REDO e corrupções no “dicionário de dados”. As análises geram relatórios e em muitos casos, a DBMS_HM faz recomendações para resolver os problemas encontrados.
As verificações podem ser executadas de duas formas:
Reativa: O diagnóstico pode ser executado de modo automático pelo oracle em resposta a um erro crítico ocorrido.
Manual: Pode ser executado por dba de forma manual usando a package dbms_hm ou pela interface do Enterprise manager.
As verificações também podem ser executadas com o banco nas seguintes formas:
1) Modo Online: verificação enquanto o banco de dados está no modo aberto ou montado.
2) Modo Desligado: Somente a verificação “Check Redo Integrity” e da “DB Structure Integrity Check” podem ser efetuadas com o banco offline, as restante devem ser efetuadas no modo online.
As seguintes verificações podem ser feitas:
1) DB Structure Integrity Check: Nesta opção é feita verificação de corrupção nos datafiles. Se o banco de dados estiver aberto , e feita verificação nos datafiles, redolog e controlfiles se o banco estiver no modo nomount só o controlfile é verificado.
Esta verificação gera relatórios de falhas se esses arquivos estiverem inacessíveis, corrompidos ou inconsistentes.
2) Data Block Integrity Check: Esta verificação detecta corrupções nos blocos de disco tais como falhas de checksum e inconsistências lógicas dentro do bloco.
3) Redo Integrity Check: Esta verificação checa se os redolog nao estão corrompidos.
4) Undo Segment Integrity Check: Esta verificação checa se os segmentos de UNDO estão corrompidos.
5) Transaction Integrity Check: Esta verificação é idêntico ao Undo Segment Integrity Check, mas ela verifica apenas uma transação específica.
6) Dictionary Integrity Check: Esta verificação de integridade dos objetos do dicionário de dados.
Abaixo verificaremos os passos necessários para verificação do check no banco de dados usando a package DBMS_HM.
OBS: Neste artigo será abordado somente a execução manual utilizando o SQLPlus.
1 – Verificando a Listagem do que pode ser verificado no banco de dados:
DB Structure Integrity Check
CF Block Integrity Check
Data Block Integrity Check
Redo Integrity Check
Transaction Integrity Check
Undo Segment Integrity Check
Dictionary Integrity Check
ASM Allocation Check
2 – Visualização das informações dos parâmetro para todas as verificações:
SQL>
1 SELECT c.name check_name,
2 p.name parameter_name,
3 p.TYPE,
4 p.DEFAULT_VALUE,
5 p.description
6 FROM v$hm_check_param p, v$hm_check c
7 WHERE p.check_id = c.id AND c.internal_check = ‘N’
8* ORDER BY c.name
SQL> /
Resultado:
CHECK_NAME PARAMETER_NAME TYPE DEFAULT_VALUE DESCRIPTION
——————————————— ————————- ——————– ——————– ————————————————–
ASM Allocation Check ASM_DISK_GRP_NAME DBKH_PARAM_TEXT ASM group name
CF Block Integrity Check CF_BL_NUM DBKH_PARAM_UB4 Control file block number
Data Block Integrity Check BLC_DF_NUM DBKH_PARAM_UB4 File number
Data Block Integrity Check BLC_BL_NUM DBKH_PARAM_UB4 Block 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
9 rows selected.
3 – Fazendo uma verificação no banco de dados usando a package DBMS_HM.
SQL> BEGIN
DBMS_HM.run_check (
check_name => ‘DB Structure Integrity Check’,
run_name => ‘Relat_Verif_Dicionario_integ’);
END;
/ 2 3 4 5 6
PL/SQL procedure successfully completed.
SQL>
4 – Visualizando o relatório em formato de texto com a package DBMS_HM (também estão disponíveis relatórios nos formatos HTML e XML):
SQL> SET LONG 100000
SET LONGCHUNKSIZE 1000
SET PAGESIZE 1000
SET LINESIZE 512
SELECT DBMS_HM.get_run_report (‘Relat_Verif_Dicionario_integ’) FROM DUAL;SQL> SQL> SQL> SQL>
DBMS_HM.GET_RUN_REPORT(‘RELAT_VERIF_DICIONARIO_INTEG’)
—————————————————————————————–
Basic Run Information
Run Name : Relat_Verif_Dicionario_integ
Run Id : 81
Check Name : DB Structure Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2015-02-24 08:56:20.723222 -03:00
End Time : 2015-02-24 08:56:21.111159 -03: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
OBS: Para esse exemplo não foram encontrados problemas na base de dados.
No próximo exemplo pegaremos o número de uma transação e usaremos os conceitos mencionados acima:
1 – Criando uma tabela
SQL> create table demo (nome varchar2(20));
Table created.
2 – Inserido um registro a tabela
SQL> insert into demo values(‘yasmin’);
1 row created.
3 – Capturando o id da transação
SQL> select dbms_transaction.local_transaction_id from dual;
LOCAL_TRANSACTION_ID
———————————-
9.25.1257
SQL>
4 – Fazendo uma verificação no banco de dados usando a package DBMS_HM.
SQL> BEGIN
DBMS_HM.RUN_CHECK (
check_name => ‘Transaction Integrity Check’,
run_name => ‘check_transacao’,
input_params => ‘TXN_ID=9.25.1257’);
END; 2 3 4 5 6
7 /
PL/SQL procedure successfully completed.
SQL>
5 – Visualizando o relatório com a package DBMS_HM
SQL> SELECT DBMS_HM.GET_RUN_REPORT(‘check_transacao’) FROM DUAL;
DBMS_HM.GET_RUN_REPORT(‘CHECK_TRANSACAO’)
———————————————————————–
Basic Run Information
Run Name : check_transacao
Run Id : 101
Check Name : Transaction Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2015-02-24 09:28:17.352833 -03:00
End Time : 2015-02-24 09:28:17.391923 -03:00
Error Encountered : 0
Source Incident Id : 0
Number of Incidents Created : 0
Input Paramters for the Run
TXN_ID=9.25.1257
Run Findings And Recommendations
Finding
Finding Name : TXN not corrupt
Finding ID : 102
Type : INFORMATIONAL
Status : OPEN
Priority : HIGH
Message : Transaction 9.25.1257 is not corrupted
6 – Listagem de todas as verificações executadas (Health Monitor View):
SQL> SELECT run_id,
name,
check_name,
run_mode,
status,
src_incident,
num_incident,
error_number
FROM v$hm_run; 2 3 4 5 6 7 8 9
RUN_ID NAME CHECK_NAME RUN_MODE STATUS SRC_INCIDENT NUM_INCIDENT ERROR_NUMBER
———- ——————————– ——————————————— ——– ———– ———— ———— ————
21 my_run Dictionary Integrity Check MANUAL ERROR 0 0 604
41 report_dictionary_integrity Dictionary Integrity Check MANUAL ERROR 0 0 604
61 TESTE_VERIF DB Structure Integrity Check MANUAL COMPLETED 0 0 0
81 Relat_Verif_Dicionario_integ DB Structure Integrity Check MANUAL COMPLETED 0 0 0
101 check_transacao Transaction Integrity Check MANUAL COMPLETED 0 0 0
1 HM_RUN_1 DB Structure Integrity Check REACTIVE COMPLETED 0 0 0
6 rows selected.
SQL>
A verificação do banco de dados também podem ser exibidas usando o seguinte comando abaixo na interface ADRCI:
[oracle@lnxorcl ~]$ adrci
ADRCI: Release 11.2.0.3.0 – Production on Tue Feb 24 09:13:05 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
ADR base = “/u01/app/oracle”
1 – Digitar o comando show hm_rum
adrci> show hm_run
ADR Home = /u01/app/oracle/diag/asm/+asm/+ASM:
*************************************************************************
0 rows fetched
<ADR_RELATION name=””>
<ADR_HOME name=”/u01/app/oracle/diag/asm/+asm/+ASM”>
ADR Home = /u01/app/oracle/diag/rdbms/orcl/orcl:
*************************************************************************
**********************************************************
HM RUN RECORD 1
**********************************************************
RUN_ID 1
RUN_NAME HM_RUN_1
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 2
START_TIME 2014-12-12 12:48:52.421402 -02:00
RESUME_TIME <NULL>
END_TIME 2014-12-12 12:48:52.492538 -02:00
MODIFIED_TIME 2014-12-12 12:48:52.492538 -02:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
**********************************************************
HM RUN RECORD 2
**********************************************************
RUN_ID 21
RUN_NAME my_run
CHECK_NAME Dictionary Integrity Check
NAME_ID 24
MODE 0
START_TIME 2015-02-24 08:42:21.593283 -03:00
RESUME_TIME <NULL>
END_TIME 2015-02-24 08:42:26.412276 -03:00
MODIFIED_TIME 2015-02-24 08:42:26.412276 -03:00
TIMEOUT 0
FLAGS 0
STATUS 6
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 604
REPORT_FILE <NULL>
**********************************************************
HM RUN RECORD 3
**********************************************************
RUN_ID 41
RUN_NAME report_dictionary_integrity
CHECK_NAME Dictionary Integrity Check
NAME_ID 24
MODE 0
START_TIME 2015-02-24 08:52:50.133302 -03:00
RESUME_TIME <NULL>
END_TIME 2015-02-24 08:52:51.568297 -03:00
MODIFIED_TIME 2015-02-24 09:00:29.198992 -03:00
TIMEOUT 0
FLAGS 0
STATUS 6
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 604
REPORT_FILE /u01/app/oracle/diag/rdbms/orcl/orcl/hm/HMREPORT_report_dictionary_integrity.hm
**********************************************************
HM RUN RECORD 4
**********************************************************
RUN_ID 61
RUN_NAME TESTE_VERIF
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 0
START_TIME 2015-02-24 08:53:19.002290 -03:00
RESUME_TIME <NULL>
END_TIME 2015-02-24 08:53:19.545951 -03:00
MODIFIED_TIME 2015-02-24 08:53:19.545951 -03:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE <NULL>
**********************************************************
HM RUN RECORD 5
**********************************************************
RUN_ID 81
RUN_NAME Relat_Verif_Dicionario_integ
CHECK_NAME DB Structure Integrity Check
NAME_ID 2
MODE 0
START_TIME 2015-02-24 08:56:20.723222 -03:00
RESUME_TIME <NULL>
END_TIME 2015-02-24 08:56:21.111159 -03:00
MODIFIED_TIME 2015-02-24 09:02:55.840258 -03:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE /u01/app/oracle/diag/rdbms/orcl/orcl/hm/HMREPORT_Relat_Verif_Dicionario_integ.hm
**********************************************************
HM RUN RECORD 6
**********************************************************
RUN_ID 101
RUN_NAME check_transacao
CHECK_NAME Transaction Integrity Check
NAME_ID 10
MODE 0
START_TIME 2015-02-24 09:28:17.352833 -03:00
RESUME_TIME <NULL>
END_TIME 2015-02-24 09:28:17.391923 -03:00
MODIFIED_TIME 2015-02-24 09:29:22.021116 -03:00
TIMEOUT 0
FLAGS 0
STATUS 5
SRC_INCIDENT_ID 0
NUM_INCIDENTS 0
ERR_NUMBER 0
REPORT_FILE /u01/app/oracle/diag/rdbms/orcl/orcl/hm/HMREPORT_check_transacao.hm
ADR Home = /u01/app/oracle/diag/clients/user_oracle/host_1193317331_80:
*************************************************************************
0 rows fetched
</ADR_HOME>
<ADR_HOME name=”/u01/app/oracle/diag/clients/user_oracle/host_1193317331_80″>
ADR Home = /u01/app/oracle/diag/tnslsnr/local/listener:
*************************************************************************
0 rows fetched
</ADR_HOME>
<ADR_HOME name=”/u01/app/oracle/diag/tnslsnr/local/listener”>
ADR Home = /u01/app/oracle/diag/tnslsnr/lnxorcl/listener:
*************************************************************************
0 rows fetched
</ADR_HOME>
<ADR_HOME name=”/u01/app/oracle/diag/tnslsnr/lnxorcl/listener”>
ADR Home = /u01/app/oracle/diag/tnslsnr/lnxorcl/listener1:
*************************************************************************
0 rows fetched
adrci>
Para uma recomendação de corrupção, e mesma pode encontrada na v$hm_recommendation;
SQL> select * from V$HM_RECOMMENDATION;
no rows selected
SQL>
OBS: Como não há objetos corrompidos no banco de dados de teste, a consulta não retorna resultados.
Podemos concluir que o “Health Monitor” é mais um mecanismo para ajudar o DBA garantir o pleno funcionamento do banco de dados.
Para melhor compreensão do assunto acima seguem as referências abaixo:
Nota MOS ID 466920.1: 11g New Feature: Health monitor