视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
undotransactionslot被覆盖引起ORA-01555的原理解析
2020-11-09 13:16:26 责编:小采
文档


undo transaction slot被覆盖引起ORA-01555的原理解析

测试环境:Oracle 11gR2 Restart

测试目的:模拟undo header事务表槽被覆盖引起ORA-01555的现象及原理解析

场景介绍:

Session 1:

获取scott.tabnow1表中记录对应的relative_fno和block_number;

Update一条记录,但不commit,记录下所使用的xid、uba信息

Session 2:

以非SYS用户连接执行:set transaction read only;

Session 1:

Commit;

Session 3:

对scott.t1表连续做update+commit操作

Session 2:

成功遍历scott.tabnow1表

select * from scott.tabnow1;

Session 4:

再次对scott.t1表连续做update+commit操作,继续覆盖事务表

Session 2:

再次遍历scott.tabnow1表

得到ORA-01555错误

测试数据库配置:

##为简化测试过程,建立了一个256K的undotbs

SQL> show parameter undo

NAME TYPE VALUE

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

undo_management string AUTO

undo_retention integer 900

undo_tablespace string UNDOSIG

SQL> select d.name,d.bytes from v$datafile d,v$tablespace t where t.ts#=d.ts# and t.name='UNDOSIG';

NAME BYTES

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

+STESTDG1/stest2/undosig.dbf 262144

##undosig里只有一个undo segment online

SQL> select segment_name,tablespace_name,relative_fno,status from dba_rollback_segs where tablespace_name='UNDOSIG';

SEGMENT_NAME TABLESPACE_NAME RELATIVE_FNO STATUS

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

_SYSSMU2$ UNDOSIG 8 ONLINE

##undo segment里extent的分布情况,除去undo header所占据的block 8,block 9~31都可以被事务用来存放修改前内容:

SQL> select segment_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='_SYSSMU2$';

SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS

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

_SYSSMU2$ 0 8 8 8

_SYSSMU2$ 1 8 16 8

_SYSSMU2$ 2 8 24 8

##测试用到的两张表初始内容:

SQL> select * from scott.tabnow1;

USERNAME USER_ID CREATED

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

XS$NULLLL 2147483638 21-OCT-11

NEWUSER 84 12-MAR-14

SCOTTTTT 83 21-OCT-11

OWBSYS_AUDIT 82 21-OCT-11

OWBSYS 78 21-OCT-11

APEX 77 21-OCT-11

APEX_PUBLIC 75 21-OCT-11

FLOWS_FILE 74 21-OCT-11

MGMT_VIEW 73 21-OCT-11

DDD 34 28-MAY-14

SQL> select * from scott.t1;

ID

----------

34

34

开始测试过程:

/////////////

//session 1:

/////////////

##确定scott.tabnow1表中的记录所在的块,便于之后对data block作dump;所有的行都在同一个block中

select dbms_rowid.rowid_relative_fno(rowid) rfno,dbms_rowid.rowid_block_number(rowid) blkno from scott.tabnow1;

RFNO BLKNO

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

4 1779

4 1779

4 1779

4 1779

4 1779

4 1779

4 1779

4 1779

4 1779

4 1779

##记录一下undo header的初始状态,slot 0x1e将成为下一个要用到的slot

TRN CTL:: seq: 0x187e chd: 0x001e ctl: 0x0000 inc: 0x00000000 nfb: 0x0001

mgc: 0xb000 xts: 0x0068 flg: 0x0001 opt: 21474836 (0x7ffffffe)

uba: 0x02000010.187e.18 scn: 0x0000.00ae9095

TRN TBL::

下载本文
显示全文
专题