在回滚段头有一个重要的数据结构称为:Control SCN.
这个SCN是最近一个被重用的事务槽的SCN(重用是按事务的先后顺序重用的)。假如Control SCN比查询的Snapshot SCN新,那么Oracle不会试图去构造前镜像,而是马上返回ORA-01555错误,因为这个UNDO信息肯定已经被覆盖了。 这个Control SCN也会被用于delayed logging cleanout的提交SCN(仅当历史事务的UNDO信息已经被覆盖),在ITL中这个SCN被标记为U,代表"upper bound commit". 我们来看一下这个数据结构: SQL> create table ud ( n number ); Table created SQL> insert into ud values(1); 1 row inserted SQL> insert into ud values(2); 1 row inserted SQL> commit; Commit complete SQL> SQL> select * from ud; N ---------- 1 2 SQL> update ud set n=1000 where n=2; 1 row updated SQL> select * from ud; N ---------- 1 1000 SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec from v$transaction; XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC ---------- ---------- ---------- ---------- ---------- ---------- 2 30 11407 251 2 10 SQL> select usn,name from v$rollname where usn=2; USN NAME ---------- ------------------------------ 2 _SYSSMU2$ SQL> alter system dump undo header '_SYSSMU2$'; System altered 检查trace文件(摘录): TRN CTL:: seq: 0x02cd chd: 0x002e ctl: 0x0018 inc: 0x00000000 nfb: 0x0000 mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe) uba: 0x008000fb.02cd.0a scn: 0x0000.0e21169a 这里TRN CTL部分的scn就是前面我们所说的Contrl SCN.
|