使用ErrorStack进行错误跟踪及诊断    关闭

  在使用Oracle数据库的过程中,可能会遇到各种各样的错误或异常,很多异常的提示并不具体,我们有必要了解一下Oracle的ErrorStack跟踪方式。

  ErrorStack是Oracle提供的一种对于错误堆栈进行跟踪的方法,通过设置跟踪可以将一些错误的后台信息详尽地转储出来,写入跟踪文件,对于错误的研究与诊断非常有效。

  设置ErrorStack主要有4个级别:

  0 仅转储错误堆栈(0级已经被逐渐废弃)

  1 转储错误堆栈和函数调用堆栈

  2 Level 1 + ProcessState

  3 Level 2 + Context area(显示所有cursors,着重显示当前cursor)

  ErrorStack可以在实例级或会话级别设置,也可以在参数文件中设置,这个设置仅当某个特定的错误出现时才被触发,如设置ORA-00942事件的跟踪:

  alter session set events '942 trace name errorstack level 1′;

  一个客户曾经出现如下ORA-01438错误,提示数据的精度超过允许值,是后台JOB调度的任务:

  Mon Jul 13 10:27:31 2009

  Errors in file /admin/erpdb/bdump/erpdb1_j000_447020.trc:

  ORA-12012: error on auto execute of job 22

  ORA-01438: value larger than specified precision

  allowed for this column

  ORA-06512: at "ERP.TIMRDU", line 13

  ORA-06512: at line 1

  跟踪文件中默认的不会记录具体的SQL、绑定变量等信息,我们可以通过ErrorStack进行后台跟踪,获得更详细的信息,执行如下代码中的SQL:

  alter system set events='

  1438 trace name errorstack forever,level 3';

  然后可以手工执行出错的存储过程(代码如下),获得跟踪文件,再关闭跟踪:

  alter system set events='1438 trace name errorstack off';

  在Oracle 10g中,这样的操作会被记录到日志文件中:

  Mon Jul 13 10:48:39 2009

  OS Pid: 541528 executed alter system set events '

  1438 trace name Errorstack forever,level 3'

  Mon Jul 13 10:56:06 2009

  Errors in file /admin/erpdb/udump/erpdb1_ora_267056.trc:

  ORA-01438: value larger than specified precision

  allowed for this column

  Mon Jul 13 10:56:08 2009

  Trace dumping is performing id=[cdmp_20090713105608]

  Mon Jul 13 10:57:15 2009

  OS Pid: 541528 executed alter system set events '

  1438 trace name Errorstack off'

  接下来分析获得的跟踪文件,就可以获得SQL文本线索,找到根本问题。在这个案例中,我们得到的跟踪文件,其关键SQL内容如下,通过这个SQL对照数据表很快就找到了精度超过的Number型字段:

  Mon Jul 13 10:48:39 2009

  OS Pid: 541528 executed alter system set events '

  1438 trace name Errorstack forever,level 3'

  Mon Jul 13 10:56:06 2009

  Errors in file /admin/erpdb/udump/erpdb1_ora_267056.trc:

  ORA-01438: value larger than specified precision

  allowed for this column

  Mon Jul 13 10:56:08 2009

  Trace dumping is performing id=[cdmp_20090713105608]

  Mon Jul 13 10:57:15 2009

  OS Pid: 541528 executed alter system set events '

  1438 trace name Errorstack off'

  在跟踪文件中,还有大量的堆栈信息,对于复杂的问题,还可以通过进一步细致的堆栈分析进行深入追踪。

  可以很容易地测试这一功能的使用,比如使用如下代码中的测试过程:

  SQL> alter system set events '984 trace name errorstack off';

  SQL> connect eygle/eygle

  SQL> create table t (name varchar2(10),id number);

  Table created.

  SQL> insert into t values(a,1);

  insert into t values(a,1)

  *

  ERROR at line 1:

  ORA-00984: column not allowed here

  SQL> alter system set events '984 trace name errorstack off';

  在告警日志文件中就可以获得如下信息:

  Mon Jul 13 22:55:59 2009

  OS Pid: 2431 executed alter system set events '

  984 trace name ERRORSTACK level 3'

  Mon Jul 13 22:59:12 2009

  Errors in file /opt/oracle/admin/mmstest/udump

  /mmstest_ora_2520.trc:

  ORA-00984: column not allowed here

  Mon Jul 13 23:01:01 2009

  OS Pid: 2431 executed alter system set events '

  984 trace name errorstack off'

  获得的跟踪文件里记录了insert的相关信息:

  *** 2009-07-13 22:59:12.928

  ksedmp: internal or fatal error

  ORA-00984: column not allowed here

  Current SQL statement for this session:

  insert into t values(a,1)

  ----- Call Stack Trace -----

  calling call entry

  argument values in hex

  location type point

  (? means dubious value)

  -------------------- -------- --------------------

  ----------------------------

  ksedst()+27 all ksedst1()

  0 ? 1 ?

  甲骨文(Oracle)重庆江北WDP学习中心,您身边的Oracle数据库认证专家。
标签: 暂无标签
Free

写了 22 篇文章,拥有财富 106,被 5 人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P5 | 发表于 2012-12-27 17:00:47
学习中。。
回复

使用道具

P5 | 发表于 2012-12-27 17:01:06
收藏中。。
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈