在日常的数据库性能诊断中,10046 Trace 被誉为“SQL 执行计划的显微镜”。它不仅能记录每条 SQL 的执行过程,还能捕获等待事件(wait events)和绑定变量(bind variables),是 DBA 和开发人员排查性能瓶颈的利器。
本文将结合 Oracle 运维最佳实践,详细介绍如何开启和关闭 10046 Trace,涵盖传统的 sql_trace
参数和更灵活的 set events
方式,并给出不同版本(11g 以前 vs 11g 及以后)的具体命令。
sql_trace:简单快捷的入门级 Trace
11g 以前的限制
在 Oracle 11g 以前的版本中,sql_trace
只能开启 Level 1 的 Trace(即基础 SQL Trace),无法捕获等待事件和绑定变量等高级信息。
- 开启 Trace:ALTER SESSION SET sql_trace = true;
- 关闭 Trace:ALTER SESSION SET sql_trace = false;
11g 及以后版本的增强
从 Oracle 11g 开始,sql_trace
得到了增强,支持通过 events
语法开启更高级的 Trace。
- 开启基础 Trace:ALTER SESSION SET events ‘sql_trace’;
- 开启带等待事件的 Trace:ALTER SESSION SET events ‘sql_trace wait=true’;
- 关闭 Trace:ALTER SESSION SET events ‘sql_trace off’;
提示:
sql_trace
的优点是简单快捷,但缺点是功能有限(尤其在 11g 以前)。如果需要更丰富的诊断信息,建议使用 10046 事件。
10046 事件:功能强大的专业级 Trace
10046 事件 是 Oracle 提供的专门用于 SQL 性能诊断的事件,支持以下级别:
级别 | 含义 |
---|---|
1 | 基础 SQL Trace(类似 sql_trace ) |
4 | 包含绑定变量(bind variables) |
8 | 包含等待事件(wait events) |
12 | 同时包含绑定变量和等待事件(最常用) |
开启 10046 Trace(当前会话)
- 开启 Level 12 的 Trace(最常用):ALTER SESSION SET EVENTS ‘10046 trace name context forever, level 12’;
- 关闭 Trace(任何级别通用):ALTER SESSION SET EVENTS ‘10046 trace name context off’;
其他常用级别示例
- 仅捕获绑定变量(Level 4):ALTER SESSION SET EVENTS ‘10046 trace name context forever, level 4’;
- 仅捕获等待事件(Level 8):ALTER SESSION SET EVENTS ‘10046 trace name context forever, level 8’;
建议与注意事项
- 权限要求: 需要具有
ALTER SESSION
权限。 - Trace 文件位置: Trace 文件默认位于
USER_DUMP_DEST
参数指定的目录(可通过SHOW PARAMETER USER_DUMP_DEST
查询)。 - 查找 Trace 文件: 执行以下 SQL 获取当前会话的 Trace 文件名:SELECT value
FROM v$diag_info
WHERE name = ‘Default Trace File’; - tkprof 格式化: 使用
tkprof
工具将原始 Trace 文件转换为易读的格式:tkprof trace_file.trc output.txt explain=username/password sys=no waits=yes sort=prsela,exeela,fchela - 对生产环境的影响: 10046 Trace 会产生大量 I/O,可能对性能有一定影响,建议在业务低峰期使用。