Browse By

Monitorando AlertLog !!

Essa técnica ja existe a muito tempo, vem me quebrando o galho já alguns anos, mas resolvi postar aqui pois alguns amigos se interessaram pois não conheciam ainda e também para que eu possa pegar o script quando não estiver no meu pc..rs

Monitorar o alertlog de uma maneira mais dinâmica e automática dava um trabalhinho nas versões anteriores ao 11g. Era(é) necessário criar procedures/functions utilizando a package UTL_FILE (pelo lado do banco) ou criar shell script para varrer o alertlog e sair catando todos os erros. Me lembro que a primeira vez que fiz um para base 9i, uns 5 anos atrás, o script tinha mais de 300 linhas..rs (me da um desconto pq foi a primeira vez que eu tinha criado um para esse propósito..rs)…
Na versão 11g tudo fica mais relax, nada de complexidade pois foi introduzia a fixed table chamada X$DBGALERTEXT. Essa fixed table lê o alertlog que tem o formato XML.

Com ela vc pode fazer o tipo de pesquisa que quiser, analisar checkpoint’s pelo lado do alert (qdo o parametro que insere a informação estiver ativo), analisar deadlocks ou qualquer tipo de erro que é o nosso caso aqui.

Abaixo, segue criação de 2 scripts que lê o spool e envia um email assim que o erro é encontrado (Pode-se colocar tudo em 1 só caso queira, só precisa modificar algumas conf’s):

Script SH:  (Lembre-se de alterar os dados de envio de email para o que vc utiliza!!)

#!/bin/ksh
# Script:  alert_monitor.sh                                  #
# Autor: Wellington Prado                                    #
# Proposito: Monitorar erros do alertlog via email!          #
# Pre-requisito: Apartir Oracle 11g                          #
#               www.wellingtonprado.com                      #
##############################################################

source /home/oracle/.bash_profile

ORACLE_SID=${1}

sqlplus -s '/ as sysdba' @alert_monitor.sql $ORACLE_SID
grep "no rows selected" ./alert_monitor_$ORACLE_SID.log

if [[ $? -eq 1 ]]; then
/tmp/sendEmail-v1.56/sendEmail -f sendlog@localhost.com -s 182.x.x.9 -u "Erro encontrado! Banco $ORACLE_SID !" -o message-file=./alert_monitor_$ORACLE_SID.log -t suporte@wellingtonprado.com

fi

Script SQL:

/*
##############################################################
# Script:  alert_monitor.sql                                 #
# Autor: Wellington Prado                                    #
# Proposito: Monitorar erros do alertlog                     #
# Pre-requisito: Apartir Oracle 11g                          #
#         www.wellingtonprado.com                            #
##############################################################
*/

SET lines 150
SET pages 500
SET feed ON
SET HEAD OFF
SET verify OFF
COL message_text FOR a150
COL ORIGINATING_TIMESTAMP FOR A38

DEFINE ORACLE_SID=&1

SPOOL ./alert_monitor_$ORACLE_SID.log

SELECT 'DATA/HORA:'||'    = '||originating_timestamp||Chr(10)||
        'IP ADDRESS:'||'    = '||HOST_ADDRESS||Chr(10)||
        'MSG ERROR: ' ||'    = '||message_text||Chr(10)||
        'MSG ARGS: '  ||'     = '||MESSAGE_ARGUMENTS||Chr(10)||
        'SUPPL DETAILS:'||' = '||SUPPLEMENTAL_DETAILS
FROM sys.X$DBGALERTEXT
    WHERE originating_timestamp > (SYSDATE-5/1440)
    AND (MESSAGE_TEXT like '%ORA-%'
        or upper(MESSAGE_TEXT) like '%ERROR%'
        or upper(MESSAGE_TEXT) like '%FATAL%'
        or upper(MESSAGE_TEXT) like '%TNS%')
 ORDER BY originating_timestamp;

SPOOL OFF
EXIT

Após isso, basta executar o script com o comando:

sh alert_monitor.sh NOME_DA_INSTANCIA

Agende pelo scheduler do Oracle ou pelo crontab do linux. Um exemplo pelo cron para executar de 5 em 5 minutos (Pois como podem ver no script .SQL eu procuro somente erros dos ultimos 5 minutos, onde vc pode alterar para colocar o intervalo que quiser!!)

*/5 * * * * sh /home/oracle/scripts/alert_monitor.sh TESTE

Para testar faça qualquer processo como resize em uma tablespace de teste para um valor que ele não possa liberar, exemplo 1M:

Wed Dec 12 10:45:02 2012
alter database datafile '/u01/app/oracle/oradata/teste/users01.dbf' resize 1M
ORA-3214 signalled during: alter database datafile '/u01/app/oracle/oradata/teste/users01.dbf' resize 1M
...

E receba seus email’s !! Lembrando que não será um email com boas notícias pois é enviado somente quando ele encontra algum tipo de erro no período analisado.

Ponto negativo: Se o banco esta indisponível, o processo não funciona, pois precisa de acesso a ele para trabalhar, ou seja, scripts a nivel de SO no meu ponto de vista são melhores pois funcionam idependente do banco estar ou não funcionando!!

(PS: lembre de limpar o alertlog (ambos xml e normal) sempre que possível, pois ajudará na performance da query (xml))!!

forte abraço

Leave a Reply

Your email address will not be published. Required fields are marked *