Fábio, eu ia te enviar em pvt, cfrme o nosso contato anterior, os
exemplos que tinha do assunto, mas vou mandar pro grupo, pode ser que
mais alguém se beneficie, aí vai :
a) trace e log de erros de conexão de rede : pra isso basta na
máquina-cliente se alterar (ou adicionar se não existirem) no arquivo
\homedooraclecliente\network\admin\sqlnet.ora os params :
TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=arq_trace
TRACE_DIRECTORY_CLIENT=D:\CHIAPPA
LOG_DIRECTORY_CLIENT=D:\CHIAPPA
LOG_FILE_CLIENT=sql_log
só lembro que arqs de log são relatórios curtos e legíveis sobre um
evento, enquanto arqs de trace contém também DUMPs (normalmente em
hexa), então traces crescem muito muito rapidamente, tenha CERTEZA de
ter vários e vários Gbs livres na máquina-cliente no disco
especificado...
A idéia aqui é, se der erro de rede NA CAMADA ORACLE, vc comparar o
trecho do log/trace onde deu erro com um duma hora que não deu erro,
pra tentar se ter uma idéia do que pode ser o erro. Logicamente se
for um middleware o culpado, provavelmente nada identificável
aparecerá nem nos logs nem nos traces...
b) triggers de erro : conectado como DBA (ou usuário similarmente
privilegiado) vc escreveria um trigger tipo :
CREATE OR REPLACE TRIGGER log_errors_trig
AFTER SERVERERROR
ON DATABASE
declare
l_sql_text ora_name_list_t; -- array com o texto do SQL
em execução
l_n number := 0; -- contador do array do texto
--
v_id number; -- valor da sequence q
alimenta o id do erro
begin
FOR n IN 1..ora_server_error_depth
LOOP
select log_errors_seq.nextval into v_id from dual;
insert into log_errors_tab values (v_id,
sysdate,
ora_login_user,
ora_client_ip_address,
ora_server_error
(n),
ora_server_error_msg(n));
--
insert into LOG_ERRORS_SESSION_tab
(select sid,
serial#,
process,
module,
machine,
terminal,
program,
type,
client_info,
row_wait_obj#,
row_wait_file#,
row_wait_block#,
row_wait_row#,
logon_time,
last_call_et,
pdml_enabled,
pq_status,
log_errors_seq.currval
from v$session
where audsid=userenv('sessionid')
);
--
l_n := ora_sql_txt( l_sql_text );
if l_n <> 0 then -- evito casos de erros sem texto de SQL,
como um DESC errado
for i in 1 .. l_n
loop
insert into LOG_ERRORS_SQL_TAB values
(log_errors_seq.currval, l_sql_text(i), i );
end loop;
end
if;
--
insert into log_usage_temp (select sys.my_v$sort_usage.*,
sysdate, v_id from sys.my_v$sort_usage);
--
insert into log_paralelos (select p.*, v_id from v_paralelos
p);
--
insert into log_sort_segment (select s.*, sysdate, v_id from
v$sort_segment s);
END LOOP;
end log_errors_trig;
/
==> no exemplo acima eu criei uma tabelinhas log_nnn num schema de
administração, e nelas eu guardo algumas infos que me são úteis (como
dados da v$session pra identificar o programa, uso de temp area, de
px slaves, texto do SQL), *** please *** antes de sair fazendo estude
no manual de Admin e no de Reference quais infos mais estão
disponíveis, use as que vc achar úteis.
[]s
Chiappa