Oracle
在 Oracle 中是否可以跟踪導致錯誤的 SQL 語句?
我們在生產中使用了 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,查找失敗的查詢