Oracle 提供診斷事件機制,可在 Session 級或 System 級設定。針對全局錯誤追蹤,建議 System 級設定,持久化需寫入 SPFILE。
SQL> ALTER SYSTEM SET EVENT = '984 TRACE NAME ERRORSTACK LEVEL 10' SCOPE = SPFILE;
System altered.
SQL> STARTUP FORCE;
-- Instance restarted with event active
參數解析:
984:目標錯誤號 (ORA-00984)TRACE NAME ERRORSTACK:輸出錯誤堆疊追蹤LEVEL 10:詳細層級 (1-10,10 最詳盡)SCOPE=SPFILE:重啟後生效,持久化SQL> CREATE TABLE t (name VARCHAR2(10), id NUMBER);
Table created.
SQL> INSERT INTO t VALUES (a, 1);
INSERT INTO t VALUES (a, 1)
*
ERROR at line 1:
ORA-00984: column not allowed here
錯誤原因:VALUES (a, 1) 中 a 未加引號被視為列名,VALUES 子句不允許列引用。
$ cd $ADR_BASE/diag/rdbms///trace
$ ls -lt *.trc | head
conner_ora_18589.trc (最大、最新)
*** 2005-03-16 09:06:56.178
ksedmp: internal or fatal error
ORA-00984: column not allowed here
Current SQL statement for this session:
INSERT INTO t VALUES (a, 1)
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
ksedmp()+269 call ksedst()+0 0 ? 0 ? 0 ? 0 ? 922C89F ? AA642A0 ?
ksddoa()+446 call ksedmp()+0 A ? AABDCA8 ? B70100B0 ? 3D8 ? 1 ? B7010114 ?
ksdpcg()+521 call ksddoa()+0 B70100B0 ? AABDCA8 ?
ksdpec()+220 call ksdpcg()+0 3D8 ? BFFF3D20 ? 1 ?
ksfpec()+133 call ksdpec()+0 3D8 ? 3D8 ? AABAE7C ? BFFF3D54 ? 9835E89 ? AA642A0 ?
| 欄位 | 值 | 意義 |
|---|---|---|
| 錯誤碼 | ORA-00984 | 目標診斷事件匹配 |
| Current SQL | INSERT INTO t VALUES (a, 1) | 直接還原問題現場 |
| Call Stack | ksedmp → ksddoa → ksdpcg → ksdpec → ksfpec | 錯誤處理內部函數鏈,開發除錯用 |
| Process Info | oracle@jumper (PID 18589) | 定位具體伺服器進程 |
EVENT='984 TRACE NAME ERRORSTACK LEVEL 10, 1000 TRACE NAME ERRORSTACK LEVEL 3'ALTER SESSION SET EVENTS '984 TRACE NAME ERRORSTACK LEVEL 10' (不需重啟,僅影響當前會話)EVENT='984 TRACE NAME ERRORSTACK LEVEL 10, 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12' 同步獲得綁定變數、等待事件ALTER SYSTEM SET EVENT = '' SCOPE = SPFILE; STARTUP FORCE;