使用ERRORSTATCK进行错误跟踪

使用ERRORSTATCK进行错误跟踪:

ERRORSTACK是Oracle提供的接口,用于诊断Oracle的错误信息。诊断事件可以在Session级设置,也可以在系统级设置,通常如果要诊断全局错误,最好在系统级设置。设置了ERRORSTACK事件之后,Oracle会将出错时的信息记入跟踪文件中,然后再出现错误时就可以通过跟踪文件进行错误诊断和排查了。

继续上篇日志的测试,尝试通过ERRORSTACK事件来跟踪ORA-01555错误:

sys@TQGZS> alter system set events '1555 trace name ERRORSTACK level 4';
System altered.
scott@TQGZS> select * from emp as of scn 6369465 where empno in (7698,7782,7788);
select * from emp as of scn 6369465 where empno in (7698,7782,7788)
              *
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number 8 with name "_SYSSMU8$" too small

检查警告日志文件,可以得到如下信息:

Tue Dec 29 21:50:16 2009
ORA-01555 caused by SQL statement below (SQL ID: 2dhvhxpasm92v, Query Duration=0 sec, SCN: 0x0000.006130b9):
Tue Dec 29 21:50:16 2009
select * from emp as of scn 6369465 where empno in (7698,7782,7788)
Tue Dec 29 21:50:16 2009
Errors in file /u01/oracle/admin/tqgzs/udump/tqgzs_ora_2759.trc:
ORA-01555: snapshot too old: rollback segment number 8 with name "???" too small

注意以上日志的信息,触发ORA-01555错误的语句被记录,出现错误的SCN也被记录(SCN: 0x0000.006130b9),进一步地,找到tqgzs_ora_2759.trc跟踪文件,从中可以获得关于这次错误的相关信息用于诊断。下面从跟踪文件中摘录一点点重要信息,进行简要说明。

⑴ 错误信息:

*** 2009-12-29 21:50:16.151
ksedmp: internal or fatal error
ORA-01555: snapshot too old: rollback segment number 8 with name "???" too small
Current SQL statement for this session:
select * from emp as of scn 6369465 where empno in (7698,7782,7788)

⑵ 数据块信息:
这里的块头就包含了ITL信息,根据这个ITL信息中的UBA,Oracle可以去定位回滚段,查询前镜像信息,如果不存在,就有可能出现ORA-01555错误。

Block header dump:  0x01010e95
Object id on Block? Y
seg/obj: 0xdf4b  csc: 0x00.8c10c9  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1010e91 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0003.00f.00000e6e  0x00800de6.0544.36  C---    0  scn 0x0000.00612fb5
0x02   0x0008.01d.000015f4  0x0080007d.062b.09  C---    0  scn 0x0000.0061313e

根据这里的Xid,可以进一步获得回滚段号、事务槽等信息,主动查询或转储回滚段信息进行研究观察。

- The End -