如何从trace文件中查找引起问题的sql_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2088 | 回复: 0   主题: 如何从trace文件中查找引起问题的sql        下一篇 
justfriend
注册用户
等级:新兵
经验:61
发帖:62
精华:0
注册:2011-11-21
状态:离线
发送短消息息给justfriend 加好友    发送短消息息给justfriend 发消息
发表于: IP:您无权察看 2015-4-23 9:00:52 | [全部帖] [楼主帖] 楼主

从trace文件中提取sql语句包括两个步骤:
首先要找到sql语句本身,然后找到sql语句可能用到的绑定变量的值。
本文假设你已经找到了报错的trace文件。

第一步:查找sql语句

跳到"Current cursor:"那行(在"*** Cursor Dump ***"部分的开始处)。记下和当前cursor关联的数字(详情参考下文例子)。
如果当前的游标数字是0,表示当前没有sql语句。在这种情况下,最好是在trace文件前面的Call Stack Trace部分看看,这里告诉我们发生错误时正在做什么。一般情况下,oracle技术支持在处理问题的时候,会查看trace文件。
如果当前游标是个非0数值,在trace文件后面的部分查找以"Cursor n"开头的行,n表示你要找的游标号,从10.2及其以后的版本开始,查找"Cursor#n"开头的行。找到后,在下一行,你会看到"cursor name:",sql语句就在其后。

注意:
通常情况下,你通过查找"Current SQL statement for this session:"就能很快定位该sql,一般会在trace文件的前面部分。
如果sql语句没有用到绑定变量(例如. ":b1", ":b2", 等。),第二步可以不看了。

第二步:查找绑定变量的值
如果sql语句使用了绑定变量,根据游标中的sql语句,你就能定位特定的文本部分,和每个绑定变量的值关联。文本的每部分以"bind x:"开头,其中的x的范围是0 到 n-1,其中的n代表绑定变量个数。
在sql语句和绑定变量之间可能会有大量的
内存dump,可以忽略这些信息。
每个绑定变量会有很多属性列表,下面是我们感兴趣的一部分列表:
a.) dty 指数据类型,常见的值为:

1 VARCHAR2 or NVARCHAR2
2 NUMBER
8 LONG
11 ROWID
12 DATE
23 RAW
24 LONG RAW
96 CHAR
112 CLOB or NCLOB
113 BLOB
114 BFILE


b.) mxl 指最大长度,即变量占用的最大字节数,dty=2 and mxl=22 表示NUMBER(22)列
c.) scl 指位数 (对NUMBER列而言) 
d.) pre 指小数点位数(对NUMBER列而言) 
e.) value 指绑定变量的值

将游标dump中的绑定变量的值和sql语句中绑定变量的值直接对应:

:b1 ~ bind 0
:b2 ~ bind 1
:b3 ~ bind 2


以此类推………

绑定变量可以称为:1, :2,等,或者:a1, :a2等。最关键的是,在sql语句中的排列顺序和变量的dump部分的排列要完全一致。
现在你应该能找到绑定变量(包括长度,数值长度,精度)以及对应的值。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论