SQL Trace 是診斷 Oracle 數據庫性能問題的核心手段。本文系統整理了針對「已知 Session ID」、「已知 OS Process ID」、「已知 SQL_ID」三類場景的多種啟用方法,並附帶實戰示例與輸出解讀要點。
以下腳本可預先建立,便於快速獲取追蹤所需標識符:
SELECT value FROM v$diag_info WHERE name = 'Default Trace File';SELECT sid, serial# FROM v$session WHERE sid=&sid;SELECT s.sid, s.serial# FROM v$process p, v$session s WHERE p.addr=s.paddr AND p.spid=&pid;SELECT sid FROM v$mystat WHERE rownum<2;啟用:
EXEC dbms_monitor.session_trace_enable(
session_id => &sid,
serial_num => &serial,
waits => TRUE,
binds => FALSE);
關閉:
EXEC dbms_monitor.session_trace_disable(
session_id => &sid,
serial_num => &serial);
參數說明:waits 等待事件、binds 綁定變量、plan_stat 執行計劃統計。
啟用:
EXEC dbms_system.set_ev(&sid, &serial, 10046, 12, '');
關閉: 將 level 設為 0
EXEC dbms_system.set_ev(&sid, &serial, 10046, 0, '');
關鍵提示: Trace 文件屬於被追蹤的 Session,而非發起追蹤的 Session。需在被追蹤 Session 中查詢 v$diag_info 才能獲得正確路徑。
ORADEBUG SETOSPID &pid
ORADEBUG EVENT 10046 TRACE NAME CONTEXT FOREVER, LEVEL 12
-- 執行目標操作 --
ORADEBUG EVENT 10046 TRACE NAME CONTEXT OFF
ORADEBUG TRACEFILE_NAME -- 顯示生成的 trace 文件路徑
示例中展示了從 PARSE、EXEC、FETCH 到 WAIT、STAT 的完整 Trace 內容,可見索引全掃描、綁定變量傾印等細節。
ALTER SYSTEM SET EVENTS 'sql_trace {process:&pid} level 12';
-- 執行目標操作 --
ALTER SYSTEM SET EVENTS 'sql_trace {process:&pid} off'; -- 關閉有延遲
適用於無法獲取 SID、只能在 OS 層面定位進程的場景。
ALTER SYSTEM SET EVENTS 'sql_trace[sql:&sql_id] level 12';
-- 執行目標 SQL --
ALTER SYSTEM SET EVENTS 'sql_trace[sql:&sql_id] off';
注意事項:
tkprof 格式化:tkprof input.trc output.txt sort=exeela,fchelaDBMS_MONITOR 的 plan_stat 參數可直接在 Trace 中獲取執行計劃。