quinta-feira, 27 de agosto de 2009

Encontre Seu Trace de Maneira Eficaz

Olá, como estão todos hoje?
Espero que muito bem.

Bom , estou aqui para lhes trazer um pequeno "brinquedinho", muito util para as pessoas que trabalham com a geração de TRACE's File cotidianamente.

Trata-se de uma procedure que lhes dirá O NOME, ONDE, USUÀRIO AUDITADO e o TEMPO em que ficou sob AUDIT sua sessão.

PROCEDURE DE TRACES

Este código esta comigo a alguns anos já, não me recordo de onde foi que eu o tirei, mais sei que é muito util e já me salvou muitas vezes.

Esta procedure tem como parametros de execução SID,SERIAL# e TEMPO ( em segundos ) , que você deseja que a sessão fique auditando e coletando informações para serem analisadas via TKPROF depois.

COMO UTILIZAR :

1) Abra uma sessão com o SYS ou SYSTEM

As Sysdba.Sys>

2) Crie a sua Procesure, sugiro que a criem debaixo do user SYS, pois este já possui por padrão as permissões nos pacotes que necessitamos para sua execução:

create or replace procedure start_trace
(v_sid in number,
v_serial# in number,
seconds in number)
is
v_user varchar2(32);
stop_trace_cmd varchar2(200);
duration number;
v_spid number;
dump_dest varchar2(200);
db_name varchar2(32);
v_version varchar2(32);
v_compatible varchar2(32);
file_name varchar2(32);
no_session_found exception;

begin
begin
select a.username,
b.spid into v_user,v_spid
from v$session a,
v$process b
where a.sid = v_sid
and a.serial# = v_serial#
and a.paddr = b.addr;
exception
when NO_DATA_FOUND then
raise no_session_found;

end;

dbms_system.set_sql_trace_in_session(v_sid,v_serial#,true);
dbms_output.put_line('Tracing Started fo User:'v_user);
dbms_output.put_line('Tracing Start Time:' to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));

if seconds is null then
duration := 60;
else
duration := seconds;
end if;

dbms_lock.sleep(duration);

dbms_system.set_sql_trace_in_session(v_sid,v_serial#,false);
dbms_output.put_line('Tracing Stop Time:' to_char(sysdate,'mm-dd-yyyy hh24:mi:ss'));

select value into dump_dest
from v$parameter
where name='user_dump_dest';

select value into db_name
from v$parameter
where name='db_name';

dbms_utility.db_version(v_version,v_compatible);

if substr(v_version,1,1)='9' then
file_name :=db_name '_ora_'v_spid'.trc';
elsif substr(v_version,1,3)='8.1' then
file_name :='ora_' v_spid'_'db_name'.trc';
elsif substr(v_version,1,3)='8.0' then
file_name :='ora_'v_spid'.trc';
end if;

dbms_output.put_line('Trace Directory:' dump_dest);
dbms_output.put_line('Trace Filename:' file_name);

exception
when no_session_found then
dbms_output.put_line('No session found for sid and serial# specified');

end;
/

Obs.: Detalhe importante , esta procedure foi feita para ser utilizada até a Release 9i, caso alguem queira se valer dela para Oracle 10g terá de adaptar a mesma.

3) Feito isso abra uma sessão onde você ira começar suas execuções a serem coletadas, e de posse do seu SID, SERIAL# vá até a sessão onde iniciou com o user SYS e execute a sua procedure :

Sysdba.Sys> exec start_trace(11,7870,40);

Tempo em Segundos de Coleta.
SID
Serial#

4) Em sua sessão original execute o que for necessário para tal. E ao transcorrer o periodo passado no parametro segundos da procedure você vai se deparar com essa saida:

Sysdba.Sys> exec start_trace(11,7870,40);
Tracing Started fo User:SYSTEM -> Usuario auditado.
Tracing Start Time:08-27-2009 14:25:58 ----\Tempo inicial utilizado na coleta
Tracing Stop Time:08-27-2009 14:26:38 ----/Tempo Final
Trace Directory:E:\oracle\admin\oaag\udump -> Representa o parametro USER_DUMP_DEST
Trace Filename:oaag_ora_2032.trc -> Nome do Arquivo de Trace gerado.

Procedimento PL/SQL concluÝdo com sucesso.

Nota: Reparem nas informações, são exatamente a reprodução do ambiente onde você encontrará seu Trace file , esperando para que você o analise.
Uma ferramenta util nesses dias tão corridos.

Abraço a todos espero que apreciem este POST rapido e prático.
Obrigado mais uma vez aos comentários!!!