DBAtlas · 数据库运维图谱

为会话启用/禁用 10046 trace 并用 TKPROF 汇总

Oracle性能

命令

-- 1) Find the target session and its trace file:
SELECT s.sid, s.serial#, s.username, s.module, p.tracefile
FROM   v$session s
  JOIN v$process p ON p.addr = s.paddr
WHERE  s.username = 'CUSTOMER_APP';

-- 2) Enable trace (waits + binds = equivalent of level 12):
BEGIN
  DBMS_MONITOR.SESSION_TRACE_ENABLE(
    session_id => <sid>,
    serial_num => <serial#>,
    waits      => TRUE,
    binds      => TRUE,
    plan_stat  => 'ALL_EXECUTIONS');
END;
/
-- Verify: SELECT sql_trace, sql_trace_waits, sql_trace_binds FROM v$session WHERE sid = <sid>;

-- 3) Disable once the problem operation completes:
EXEC DBMS_MONITOR.SESSION_TRACE_DISABLE(session_id => <sid>, serial_num => <serial#>);

-- Alternatives:
-- Your own session: ALTER SESSION SET EVENTS '10046 trace name context forever, level 12';
-- Single SQL_ID, all sessions: ALTER SYSTEM SET EVENTS 'sql_trace[SQL: <sql_id>] wait=true, bind=true';
--   disable: ALTER SYSTEM SET EVENTS 'sql_trace[SQL: <sql_id>] off';
-- For a connection pool: DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE / SERV_MOD_ACT_TRACE_ENABLE

-- 4) Summarize with TKPROF on the OS (most expensive SQL first):
-- $ tkprof /u01/app/oracle/diag/rdbms/orcl/ORCL/trace/ORCL_ora_12345.trc /tmp/ora_12345.prf \
--     sys=no sort=exeela,fchela,prsela waits=yes aggregate=yes

作用

扩展 SQL trace(10046)将会话执行的每条 SQL 的 parse/execute/fetch 时间、等待事件和绑定值写入 trace 文件;TKPROF 将其转换为按 SQL 汇总的可读报告。

适用场景

当 AWR/ASH 不够用、必须端到端证明单个用户操作的时间花在哪里时;用于应用与数据库之间的往返(SQL*Net)问题。

注意

无需许可。trace 文件增长很快,并会给目标会话带来开销;请保持时间短并务必禁用(检查 DBA_ENABLED_TRACES 中的残留)。binds=TRUE 会将敏感数据(身份证号、卡号等)写入 trace 文件。ALTER SESSION SET EVENTS 需要 ALTER SESSION 权限(否则 ORA-01031)。TKPROF 默认不显示绑定值;请保留原始 .trc 文件。

在 DBAtlas 中打开 →

相关内容