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.