Oracle 10g 引入 trcsess 工具,可依 Session ID、Module 名稱等條件,從大量追蹤檔中擷取特定會話的追蹤資料並合併輸出。對於共用伺服器架構(一個會話產生多個追蹤檔)特別有用。
-- 1. 開啟計時統計(8.1.7+)
ALTER SESSION SET TIMED_STATISTICS = TRUE;
-- 2. 設定追蹤檔大小無限制(9i+)
ALTER SESSION SET MAX_DUMP_FILE_SIZE = UNLIMITED;
-- 3. 設定追蹤檔識別碼,易於辨識(9i+)
ALTER SESSION SET TRACEFILE_IDENTIFIER = 'POX20031031a';
-- 4. 開啟 SQL 追蹤(Level 8:含等待事件)
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER, LEVEL 8';
-- 此處執行應用程式邏輯
-- 5. 關閉追蹤
ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF';
Level 說明:0=關閉、1=基本、4=含繫結變數、8=含等待事件、12=1+4+8 全部。
需先從 V$SESSION 取得目標 SID、SERIAL#。
-- 開啟計時與追蹤檔大小
EXEC SYS.DBMS_SYSTEM.SET_BOOL_PARAM_IN_SESSION(sid, serial, 'timed_statistics', TRUE);
EXEC SYS.DBMS_SYSTEM.SET_INT_PARAM_IN_SESSION(sid, serial, 'max_dump_file_size', 2147483647);
-- 開始追蹤
EXEC SYS.DBMS_SUPPORT.START_TRACE_IN_SESSION(sid, serial, WAITS=>TRUE, BINDS=>FALSE);
-- 執行目標應用程式
-- 停止追蹤
EXEC SYS.DBMS_SUPPORT.STOP_TRACE_IN_SESSION(sid, serial);
EXEC SYS.DBMS_SYSTEM.SET_EV(sid, serial, 10046, 8, ''); -- 開啟 Level 8
-- 執行目標應用程式
EXEC SYS.DBMS_SYSTEM.SET_EV(sid, serial, 10046, 0, ''); -- 關閉
追蹤檔位於 USER_DUMP_DEST 或 BACKGROUND_DUMP_DEST。檔名包含 OS Process ID(V$PROCESS.SPID),可透過以下查詢取得:
SELECT p.spid
FROM v$process p, v$session s
WHERE p.addr = s.paddr
AND s.sid = :sid
AND s.serial# = :serial;
trcsess output=merged.trc session=123.456 *.trc
# 依 Session ID 合併所有 *.trc 為 merged.trc
trcsess output=module.trc module=OrderEntry *.trc
# 依 Module 名稱合併
trcsess 解決共用伺服器環境下追蹤檔碎片化問題,配合 10046 事件與 DBMS_SUPPORT/DBMS_SYSTEM 套件,構建完整的 SQL 效能診斷工具鏈。