![如何在 oracle .trc 文件中找到准备好的语句的查询参数?](https://linux22.com/image/535237/%E5%A6%82%E4%BD%95%E5%9C%A8%20oracle%20.trc%20%E6%96%87%E4%BB%B6%E4%B8%AD%E6%89%BE%E5%88%B0%E5%87%86%E5%A4%87%E5%A5%BD%E7%9A%84%E8%AF%AD%E5%8F%A5%E7%9A%84%E6%9F%A5%E8%AF%A2%E5%8F%82%E6%95%B0%EF%BC%9F.png)
我有一个 oracle 查询生成 3137 错误,并且跟踪文件包含该查询。例如:
select x from y where z = :1
我认为如果我能确定:1 的具体值,这将有助于隔离问题,但 4.7M 文件似乎没有提供该信息。
这些信息存储在 trc 文件中吗?
这是在 redhat 上运行的 oracle 11g。
答案1
不确定 .trc 文件描述在这里和你的制作方法是一样的,但这可能会对你有所帮助。
本质上,其中某处应该有一个 Binds 部分,显示哪些值绑定到该 :1 变量。由于示例只有一个查询(我无法通过查看它来弄清楚),因此本文没有很好地解释如何分辨哪些绑定到哪些查询。忽略他们sort|uniq
在最后用来表明它总是一遍又一遍地重复相同的查询的部分,您应该得到如下结果
Bind#0
value=55
管他呢。
答案2
值得一看踪迹分析器如果您有 Oracle 支持合同。
答案3
问题的根源
如果缺少跟踪 (.trc) 文件绑定变量值(或者例如 ODP.NET 中 OracleCommand 中的参数值)这是由于跟踪的启动方式造成的。
如果您使用以下命令之一作为使用应用程序跟踪工具页面状态:
ALTER SESSION SET SQL_TRACE = TRUE;
EXEC DBMS_SESSION.set_sql_trace(sql_trace => TRUE);
..你是不是记录绑定值!
解决方案
要记录绑定变量值,还有其他替代方法来启动跟踪,具体取决于您的数据库版本和加载的包。如果您使用的是 Oracle 10g+,最简单的方法是使用以下命令启动跟踪:
DBMS_MONITOR.session_trace_enable(waits=>FALSE, binds=>TRUE)
以下是启动绑定变量记录跟踪的可用命令的完整列表(来源:Oracle 10g 中的 SQL 跟踪、10046、trcsess 和 tkprof):
-- All versions.
ALTER SESSION SET EVENTS '10046 trace name context forever, level 8';
EXEC DBMS_SYSTEM.set_ev(si=>123, se=>1234, ev=>10046, le=>4, nm=>' ');
-- All versions, requires DBMS_SUPPORT package to be loaded.
EXEC DBMS_SUPPORT.start_trace(waits=>FALSE, binds=>TRUE);
EXEC DBMS_SUPPORT.start_trace_in_session(sid=>123, serial=>1234, waits=>FALSE, binds=>TRUE);
-- Oracle 10g
EXEC DBMS_MONITOR.session_trace_enable(waits=>FALSE, binds=>TRUE);
EXEC DBMS_MONITOR.session_trace_enable(session_id =>1234, serial_num=>1234, binds=>TRUE, binds=>TRUE);
EXEC DBMS_MONITOR.client_id_trace_enable(client_id=>'tim_hall', waits=>FALSE, binds=>TRUE);
EXEC DBMS_MONITOR.serv_mod_act_trace_enable(service_name=>'db10g', module_name=>'test_api', action_name=>'running', -
> waits=>FALSE, binds=>TRUE);