Usando SQL para ver o conteúdo do alert.log até o 10gr2

Olá amigos,

Creio que este será o último post de 2010. Rsrsrs Então, Feliz 2011!!!!

Estava querendo ver o conteúdo do alert.log de um servidor através de SQL. Procurei na internet e peguei um script pronto, precisava dar uma ajustada no código, por isso eu criei um Pl/Sql que manda por e-mail o conteúdo do alert diariamente.
Agora basta colocar no scheduler para rodar 2x por dia. Caso seja interessante, ajuste o código filtrando erros e só mande e-mail quando der erro, enfim, use sua imaginação. Nesse caso ela pode ser agendada para rodar de 10 em 10 minutos, por exemplo.

1) Limpeza dos objetos

drop directory bdump;
drop table system.alert_log;
drop function system.alert_log_date;
drop procedure system.vfy_alert_log;

2) Criação do diretório. Obs.: Consulte o path do seu alert!!! SQL> show parameter bdump

create directory bdump as ‘d:oracleadminorclbdump’;

3) Crie uma tabela externa para ver o seu alert.

create table system.alert_log ( msg varchar2(80) )
organization external (
type oracle_loader
default directory bdump
access parameters (
records delimited by newline
)
location(‘alert_orcl.log’)
)
reject limit unlimited;

4) Criação da function para transformar o texto passado para ela em data formatada. Será usado na cursor da procedure.

create or replace function system.alert_log_date(text in varchar2)
return date
is
invaliddate  exception;
pragma exception_init(invaliddate, -1846);
begin
return to_date(text,’Dy Mon DD HH24:MI:SS YYYY’ ,’NLS_DATE_LANGUAGE=AMERICAN’);
exception
when invaliddate then return null;
end;
/

5) Criação da procedure que checa o alert.log e manda e-mail

create or replace procedure system.vfy_alert_log
is
v_conn            utl_smtp.connection;
v_crlf            varchar2 (2) := chr (13) || chr (10);
v_mesg            clob;
v_data            date;
v_texto           clob;
v_string          clob;

cursor alertlog is
select alert_date, alert_text
from
(
select row_num
,last_value(low_row_num ignore nulls) over(order by row_num rows between unbounded preceding and current row) start_row
,last_value(alert_date  ignore nulls) over(order by row_num rows between unbounded preceding and current row) alert_date
,alert_text
from (
select
rownum row_num
, nvl2(system.alert_log_date(msg),rownum,null) low_row_num
,system.alert_log_date(msg) alert_date
,msg alert_text
from system.alert_log
)
)
where to_char(alert_date,’DD-MON-RR’) = to_char(sysdate,’DD-MON-RR’);

begin

v_string := ‘ ‘;

open alertlog;

loop
fetch alertlog into v_data, v_texto;
v_string := v_string || v_crlf || v_data || ‘ ‘ || v_texto || v_crlf;
exit when alertlog%notfound;
end loop;
close alertlog;

v_conn := utl_smtp.open_connection (‘dtsmail.xpto.com.br’, 25);

utl_smtp.helo (v_conn, ‘dtsmail.xpto.com.br’);
utl_smtp.mail (v_conn, ‘rodrigo.assis@xpto.com.br’);
utl_smtp.rcpt (v_conn, ‘rodrigo.assis@xpto.com.br’);

v_mesg :=
‘Date: ‘
|| to_char (sysdate, ‘dd Mon yy hh24:mi:ss’)
|| v_crlf
|| ‘From: DBA  <dba@xpto.com.br> ‘
|| v_crlf
|| ‘Subject: Alert_log ‘ ||to_char (sysdate, ‘dd Mon yy hh24:mi:ss’)
|| v_crlf
|| ”
|| v_crlf
|| v_string
|| ”
|| v_crlf
|| ‘Atenciosamente,’
|| v_crlf
|| ”
|| v_crlf
|| ‘Rodrigo Mufalani’
|| v_crlf
|| ‘Oracle Ace Member’
|| v_crlf
|| ‘OCP 10g e 11g’
|| v_crlf
|| ‘OCE RAC 10g R2’
|| v_crlf
|| ‘http://www.mufalani.com.br’
|| v_crlf;
utl_smtp.data (v_conn, v_mesg);
utl_smtp.quit (v_conn);

exception
when no_data_found
then
null;
end;
/

6) Pronto!!! Basta agendar usando dbms_scheduler, dbms_job, crontab, windows scheduler e ou qualquer outro programa que lhe vier a mente.

Begin

system.vfy_alert_log

end;

/

A query do cursor e a function eu copiei do link http://techsudo.blogspot.com/2009/01/query-oracle-alert-log-using-sql.html

Nada como usar o  google quando se precisa, e é por isso que eu coloquei esse código aqui, copiem, alterem e melhorem o mesmo.

**********************************
*********       Feliz 2011     ***********
**********************************

Att,

Rodrigo Mufalani

Ps.: Deixe seu comentério, crítica e etc, ele é muito importante para melhorar o conteúdo do blog.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *