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 [email protected] -s 182.x.x.9 -u "Erro encontrado! Banco $ORACLE_SID !" -o message-file=./alert_monitor_$ORACLE_SID.log -t [email protected] 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
Bom post…
Wellington, você tem esse mesma solução para os bancos 10g?
att,
Fábio Luiz
Bom post…
Wellington, você tem esse mesma solução para os bancos 10g?
att,
Fábio Luiz