Amigo Chiappa,
            muítissimo obrigado. Coloquei no grupo porque mesmo sabendo que 
você sempre ajuda de muito boa vontade, não quero ser abusado, então postei 
estas dúvidas no banco.

sds
Gibon
  ----- Original Message ----- 
  From: jlchiappa 
  To: [email protected] 
  Sent: Friday, April 20, 2007 11:14 AM
  Subject: [oracle_br] Traces e LOGs de rede, triggers de erro - para Fábio 
Gibon e grupo


  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




   

[As partes desta mensagem que não continham texto foram removidas]

Responder a