如何在 oracle .trc 文件中找到准备好的语句的查询参数?

如何在 oracle .trc 文件中找到准备好的语句的查询参数?

我有一个 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);

相关内容