Oracle 12c数据库追踪仅显示参数名,如何查看实际值及优化追踪?
问题描述
已完成数据库设计,开启SQL追踪后,trace文件仅显示参数占位符(如:B6)而非实际参数值,无法对应应用各页面的查询操作。同时希望了解获取应用端用户执行查询的更优方案,或优化当前追踪配置以获取带真实参数值的完整语句。
已执行的操作:
ALTER SYSTEM SET sql_trace = TRUE; SELECT * FROM V$SESSION WHERE USERNAME = 'myDb'; EXEC DBMS_MONITOR.SESSION_TRACE_ENABLE(session_id => 1338 , serial_num => 8269, waits => TRUE, binds => TRUE);
使用tkprof处理trace文件的命令:
tkprof myTraceFile.trc myTraceTxtFile.txt sys=no sort=fchela
处理后的输出片段:
SQL ID: 9m22qp63dh8tp Plan Hash: 0 ALTER SESSION SET REMOTE_DEPENDENCIES_MODE=SIGNATURE call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 2 0.00 0.00 0 0 0 0 Execute 2 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 4 0.00 0.00 0 0 0 0 Misses in library cache during parse: 0 Parsing user id: 588 ******************************************************************************** SQL ID: 3hvc6qdvdxkf4 Plan Hash: 0 INSERT INTO DOCUMENT (DOC_NO, TAX_TYPE_NO, TAX_PERIOD_NO, TAX_PAYER_NO, DOC_TYPE_NO, CREATED_DATE, LETTER_NO, ASSESS_NO, RECEIVED_DATE, PRINTED_DATE) VALUES (:B56 , :B55 , :B54 , :B53 , :B52 , :B51 , :B50 , :B49 , :B48 , :B47 , :B46)
需求:获取包含真实参数值的完整查询语句。
解决方案
一、优化当前追踪配置获取绑定变量值
你的SESSION_TRACE_ENABLE已经设置了binds => TRUE,但tkprof默认不会输出绑定变量信息,需调整命令参数:
修改tkprof命令
添加binds=yes参数,让处理后的文件包含绑定变量实际值:tkprof myTraceFile.trc myTraceTxtFile.txt sys=no sort=fchela binds=yes重新执行后,输出文件会新增类似如下的绑定变量条目:
BINDS FOR SQL_ID 3hvc6qdvdxkf4: ------------- B56 (VARCHAR2(10)): 'DOC20240501' B55 (NUMBER): 1001 ...直接查看原始trace文件
原始.trc文件本身包含绑定变量的详细信息,搜索BINDING关键词即可找到每个占位符对应的实际值,无需依赖tkprof处理。
二、更优的查询追踪方案
1. 动态性能视图实时查询
无需开启trace,直接通过V$SQL和V$SQL_BIND_CAPTURE视图获取已执行SQL的绑定变量:
SELECT s.sql_id, SUBSTR(s.sql_text, 1, 200) AS sql_text, bc.name AS bind_name, bc.value_string AS bind_value FROM V$SQL s JOIN V$SQL_BIND_CAPTURE bc ON s.sql_id = bc.sql_id WHERE s.parsing_user_id = (SELECT user_id FROM all_users WHERE username = 'myDb') ORDER BY s.last_active_time DESC;
该方法实时性强,适合临时排查特定用户的SQL执行情况。
2. 客户端标识符精准追踪
若需关联应用页面或用户,可通过设置客户端标识符实现精准追踪:
- 应用端在数据库连接时设置标识符(如对应页面ID):
EXEC DBMS_SESSION.SET_IDENTIFIER('APP_PAGE_INVOICE_CREATE'); - 数据库端开启该客户端的追踪:
EXEC DBMS_MONITOR.CLIENT_ID_TRACE_ENABLE(client_id => 'APP_PAGE_INVOICE_CREATE', binds => TRUE);
这样可只追踪目标页面的所有SQL及绑定变量,减少无用日志。
3. AWR报告分析历史SQL
若需分析长期运行的SQL及绑定变量,可生成AWR(Automatic Workload Repository)报告,报告中包含高频执行SQL的绑定变量统计信息,适合性能分析场景。
内容的提问来源于stack exchange,提问作者Shakor Maiwand
相关产品推荐
相关产品推荐

