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
   

Responder a