A partir da
versão 11g a Oracle disponibilizou uma “package” que permite realizar testes e
diagnosticar problemas no banco de dados, seu nome é DBMS_HM. Neste artigo
vamos demonstrar o uso da DBMS_HM.
NOTA: Neste artigo será abordada somente a execução manual utilizando
o SQL*Plus. Para a ativação ou execução via Enterprise Manager, favor verificar
o manual (Oracle®
Database Administrator´s Guide 11gR2).
A “package”
DBMS_HM, 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
em resposta a um erro crítico ocorrido.
Manual: O DBA pode
executar manualmente verificações utilizando a “package” DBMS_HM ou a interface
do Enterprise Manager.
As verificações podem ser
executadas com o banco “online” ou em “offline” (modo NOMOUNT).
Somente a verificação “Integrity Check Redo e o DB Structure Integrity Check”,
não pode ser realizada no modo “online”, as demais todas podem ser executadas.
Tipos de verificações:
DB Structure Integrity Check: Verifica a integridade dos “datafiles” e gera
relatórios de falhas se esses arquivos estiverem inacessíveis, corrompidos ou
inconsistentes. Se o banco de dados estiver “online” verifica os arquivos de “redolog”,
“datafiles” e “controlfile”. Se o banco de dados estiver “offline” verifica apenas
os arquivos de “controlfiles”.
Data Block Integrity Check: Verifica e detecta corrupções
nos blocos dos discos, tais como falhas de checksum, incompatibilidades com os
“headers e tails” e inconsistências lógicas dentro do bloco.
Redo Integrity Check: Verifica se o conteúdo do “redolog”
não está corrompido.
Undo Segment Integrity Check: Verifica se o segmento de “undo”
possui corrupções. Ao localizar uma corrupção no segmento de “undo”, essa
verificação usa os processos de “PMON” e “SMON” para tentar recuperar a
transação corrompida. Se esta recuperação falhar, então a package DBMS_HM armazena
as informações sobre a corrupção na visão V$CORRUPT_XID_LIST.
Transaction Integrity Check: Verificação identica a “Undo
Segment Integrity Check” exceto que é verifica apenas uma transação
específica.
Dicionário Integrity Check: Verificação que examina a
integridade dos objetos do dicionário de dados.
A seguir serão apresentados os
passos para a execução da verificação da base de dados, utilizando a “package”
DBMS_HM.
Conectar-se ao SQL*Plus com o usuário
SYS.
SQL> conn / as sysdba
Connected.
Verificar quais são as opções disponíveis para o “check” no banco de
dados, consultar a visão V$HM_CHECK:
SQL> SELECT name
FROM v$hm_check WHERE internal_check='N';
NAME
----------------------------------------------------------------
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
8 rows selected.
A maioria das
verficações do banco de dados são apresentadas através da visão
V$HM_CHECK_PARAM.
SQL> SET LINESIZE
200
SQL> SET PAGES 200
SQL> COLUMN
CHECK_NAME FORMAT A30 HEADING
"NOME"
SQL> COLUMN
PARAMETER_NAME FORMAT A20 HEADING "PARAMETROS"
SQL> COLUMN
TYPE FORMAT A15 HEADING
"TIPOS"
SQL> COLUMN
DEFAULT_VALUE FORMAT A15 HEADING
"VALORES DEFAULT"
SQL> COLUMN
DESCRIPTION FORMAT A40 HEADING
"DESCRICAO"
SQL>
SQL> SELECT C.NAME
CHECK_NAME, P.NAME PARAMETER_NAME, P.TYPE, P.DEFAULT_VALUE, P.DESCRIPTION
2
FROM V$HM_CHECK_PARAM P,
V$HM_CHECK C
3
WHERE P.CHECK_ID = C.ID
4
AND C.INTERNAL_CHECK = 'N'
5
ORDER BY C.NAME;
NOME PARAMETROS TIPOS VALORES DEFAULT DESCRICAO
---------------------------- -----------------
--------------- --------------- ---------------------
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.
A procedure utilizada para executar uma verficação no banco de dados é a
“DBMS_HM.RUN_CHECK”.
SQL> BEGIN
DBMS_HM.run_check (
check_name => 'DB Structure Integrity Check',
run_name => 'TESTE_VERIF');
END;
/
PL/SQL procedure successfully completed.
Os resultados da verificação podem ser apresentados usando alguns dos recursos descrito abaixo:
Através da execução da função DBMS_HM.GET_RUN_REPORT, que retorna
um relatório dos resultados em
formato texto, HTML ou XML.
Os resultados também podem ser consultados diretamente nas visões V$HM_RUN, V$HM_FINDING e na V$HM_RECOMMENDATION.
O Oracle Enterprise Manager permite utilizar o “Health Monitor”.
Abaixo é apresentada a saída da verificação, utilizando a função DBMS_HM.GET_RUN_REPORT.
SQL> SET LONG 100000
SET LONGCHUNKSIZE 1000
SET PAGESIZE 1000
SET LINESIZE 512
SELECT DBMS_HM.get_run_report('TESTE_VERIF') FROM
dual;
DBMS_HM.GET_RUN_REPORT('TESTE_VERIF')
------------------------------------------------------------------
Basic Run Information
Run Name : TESTE_VERIF
Run Id : 1
Check Name : DB Structure Integrity Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2013-11-19 10:02:10.037605
-02:00
End Time : 2013-11-19
10:02:10.228833 -02:00
Error
Encountered : 0
Source Incident
Id : 0
Number of
Incidents Created : 0
Input Paramters for the Run
Run
Findings And Recommendations
Para
esse exemplo não foram
encontrados problemas na base de dados, porém abaixo segue um exemplo de onde
foi encontrado um problema.
SQL> SET LONG 100000
SET LONGCHUNKSIZE 1000
SET PAGESIZE 1000
SET LINESIZE 512
SELECT DBMS_HM.get_run_report('TESTE_VERIF_2') FROM
dual;
DBMS_HM.GET_RUN_REPORT('TESTE_VERIF_2')
------------------------------------------------------------------------------
Basic Run Information
Run Name : teste_verif_2
Run Id : 2
Check Name : DB Structure Integrity
Check
Mode : MANUAL
Status : COMPLETED
Start Time : 2013-11-19 10:02:10.037605
-02:00
End Time : 2013-11-19
10:02:10.228833 -02: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 : Corrupt Datafile
Finding ID : 334
Type : FAILURE
Status : OPEN
Priority : HIGH
Message : Datafile 10:
'/app/oracle/oradata/test01.dbf' is corrupt
Message : Some objects in tablespace TEST might
be unavailable
Para o exemplo acima será
necessário corrigir a corrupção do “datafile” da tablespace TESTE.
Concluímos portanto que o “Health
Monitor” dá mais um mecanismo para o DBA garantir o pleno
funcionamento do banco de dados.
Referências: Oracle®
Database Administrator´s Guide 11gR2 (11.2)
Oracle®
Database PL/SQL Packages and Types Reference 11gR2 (11.2)
MSc.
Rubens Oliveira
DBA Oracle Consultor