dml操作时,undo究竟是如何工作的(一)?
上一篇 / 下一篇 2008-01-18 08:46:28 / 个人分类:数据库(oracle)
Undo初步研究一
Dml语句涉及的undo操作,大致有如下五点描述,但此仅仅是一些轮廓性的描述,用来学习记录之用,更深入,更细节的部分,诸如延迟块清除,redo和undo的配合等等,还需要做更多实验,看更多大师们的著作。
一:如果sql涉及的block不在database buffer
cache中,则从数据文件中读取进缓存。
(如果缓存的空间不够,就要涉及oracle对
内存空间的管理)。
二:在回滚段的事务表上为该事务分配一个事务槽,事务槽中记录了事务槽号,前镜像的地址(dba)等信息,在undo block的头部有xid,记录该块对应的事务槽号(事务信息,回滚段头,回滚段事务表的事务槽,回滚段块有机的联系在一起);在回滚记录(undo recoder)中记录有对应的数据块地址(bdba)。
三:在数据块中分配itl槽,进行行锁定。itl中包含xid,uba等信息,xid中包含了对应事务的回滚段号,事务槽号,uba对应回滚段信息;由此我们可以看出,在data block的块头中有指向前镜像的uba信息,同时,在回滚段的回滚记录中,也有指向data block的地址。
四:dml database buffer cache中的记录。
五:若事务rollback,则从回滚段中取得前镜像来覆盖database buffer cache;若commit,则释放回滚段事务表上的事务槽,释放数据块中的itl,重置行记录上的锁定位(lb)
本文是在参考eygle大师的《dba入门,进阶与诊断案例》》一书基础上完成的。的以下实验,作为学习记录之用,仅作参考。
Session 1,用scott连进去
SQL> UPDATE EMP SET SAL=5000 WHERE EMPNO=7782;
已更新1行。
查询该session的id和对应的事务号
SQL> SELECT SID,SERIAL#,TADDR FROM V$SESSION WHERE USERNAME='SCOTT';
SID SERIAL# TADDR
---------- ---------- --------
9 9 67B7A1FC
session 2,同样用scott连进去
SQL> UPDATE EMP SET SAL=4500 where empno=7876;
已更新1行。
SQL> SELECT SID,SERIAL#,TADDR FROM V$SESSION WHERE USERNAME='SCOTT' AND SID<>9;
SID SERIAL# TADDR
---------- ---------- --------
13 25 67B8DB1C
以sys登录,查看v$transaction
SQL> select * from v$transaction;
ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS
-------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------
67B7A1FC 10 43 308 2 168 62 32 ACTIVE
67B8DB1C 1 21 309 2 10 66 39 ACTIVE
可以看到第一个session对应10号回滚段的43号事务槽,第二个session对应1号回滚段的21号事务槽。
从v$rollstat也可以看到相对应的信息
SQL> select * from v$rollstat;
USN LATCH EXTENTS RSSIZE WRITES XACTS GETS WAITS
---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
0 0 6 385024 4520 0 57 0
1 1 8 516096 57910 1 904 0
2 2 8 516096 85662 0 1345 0
---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- -----
---------- ---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- -----
9 0 8 516096 83482 0 1340 0
10 1 7 450560 35204 1 573 0
其中xact=0表示空闲的回滚段,当前没有事务,xact=1表示当前活动的回滚段,usn(undo segment number)为回滚段号,resize为回滚段大小。
查询v$rollname,获取回滚段名称
SQL> select * from v$rollname;
USN NAME
---------- ------------------------
0 SYSTEM
1 _SYSSMU1$
2 _SYSSMU2$
。。。。。。。。。。。。。。。。。
9 _SYSSMU9$
10 _SYSSMU10$
11 rows selected
转储 _SYSSMU1$,_SYSSMU10$回滚段头
SQL> alter system dump undo header "_SYSSMU1$";
System altered
SQL> alter system dump undo header "_SYSSMU10$";
System altered
SQL>
分别另存undo_header_before_commit_SYSSMU1$,undo_header_before_commit_SYSSMU10$
********************************************************************************
Undo Segment: _SYSSMU1$ (1)
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 8 #blocks: 63
last map 0x00000000 #maps: 0 offset: 4080
Highwater:: 0x0080000a ext#: 0 blk#: 0 ext size: 7
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 0
Unlocked
…………………………………………………………………………………………………………..
…………………………………………………………………………………………………………..
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num
------------------------------------------------------------------------------------------------
0x14 9 0x00 0x0135 0xffff 0x0000.0005a352 0x0080000a 0x0000.000.00000000 0x00000001 0x00000000
0x15 10 0x80 0x0135 0x0000 0x0000.0005a360 0x0080000a 0x0000.000.00000000 0x00000001 0x00000000
0x16 9 0x00 0x0134 0x0017 0x0000.00059f1e 0x00800618 0x0000.000.00000000 0x00000001 0x00000000
回滚段头中分配了一系列的事务槽,index代表事务槽号,16进制的0x15 =21,state=10表示出于活动状态,uba代表了该事务槽对应的前镜像地址,此处的信息和v$transaction完全一致。
_SYSSMU10$段头的情况类似,如下:
********************************************************************************
Undo Segment: _SYSSMU10$ (10)
********************************************************************************
0x2a 9 0x00 0x0134 0xffff 0x0000.0005a114 0x00000000 0x0000.000.00000000 0x00000000 0x00000000
0x2b 10 0x80 0x0134 0x0001 0x0000.0005a16a 0x008000a8 0x0000.000.00000000 0x00000001 0x00000000
0x2c 9 0x00 0x0133 0x002d 0x0000.0005911c 0x008000a6 0x0000.000.00000000 0x00000001 0x00000000
导入论坛 引用链接 收藏 分享给好友 推荐到圈子 管理 举报
TAG: undo研究