Oracle

在 Oracle 中是否可以跟踪導致錯誤的 SQL 語句?

  • August 28, 2018

我們在生產中使用了 Oracle 11g。應用系統仍在積極開發中。獲取導致任何錯誤的 SQL 語句將非常方便。

Oracle 是否提供標準函式來跟踪和記錄這些語句和其他(調試)資訊?

雖然我不確定這是否是最簡單的方法,但您可以使用after servererror on database觸發器將所有錯誤記錄到表中。

Ferdous Nadvi從將所有數據庫錯誤記錄到表中:

drop trigger log_errors_trig;
drop table   log_errors_tab;

create table log_errors_tab (
 error     varchar2(30),
 timestamp date,
 username  varchar2(30),
        osuser    varchar2(30),
        machine   varchar2(64),
 process   varchar2(8),
 program   varchar2(48));

create or replace trigger log_errors_trig 
 after servererror on database
declare
 var_user     varchar2(30);
 var_osuser   varchar2(30);
 var_machine  varchar2(64);
 var_process  varchar2(8);
 var_program  varchar2(48);
begin
 select username, osuser, machine, process, program
 into   var_user, var_osuser, var_machine, var_process, var_program
 from   sys.v_$session
 where  audsid = userenv('sessionid');

 insert into log_errors_tab
   values(dbms_standard.server_error(1),sysdate,var_user,
          var_osuser,var_machine,var_process,var_program);
end;
/

另請參閱PSOUG 上的Oracle 系統事件觸發器和系統事件觸發器的官方文件

查找失敗的查詢。使用以下 plsql 觸發器查找查詢。

CREATE TABLE QUERY_LOG (ID              NUMBER,ORA_ERR         VARCHAR2(10),EXE_DATE        DATE,QRY_LOG         NCLOB);

CREATE SEQUENCE QUERY_LOG_ID NOCACHE;

CREATE OR REPLACE TRIGGER Failed_To_Extend_Temp
AFTER SERVERERROR ON DATABASE
DECLARE
   l_sql_text ora_name_list_t;
   l_n        NUMBER;
   t1         NCLOB;
BEGIN
   --IF (is_servererror(942) ) THEN
   l_n := ora_sql_txt(l_sql_text );

   FOR I IN 1 .. l_n
   LOOP
       t1 := t1||l_sql_text(i);
   END LOOP;

   INSERT INTO QUERY_LOG (Id , Ora_Err , EXE_DATE , QRY_LOG)
   VALUES (QUERY_LOG_ID.Nextval, ora_server_error(1), Sysdate,t1 );
--END IF;
END;
/

觀看我的 YouTube 影片Oracle,查找失敗的查詢

引用自:https://dba.stackexchange.com/questions/40318