使用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: 0Itl 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 -