Commit过程中redo、undo、数据块交互过程实验 实验目的Commit过程中redo、undo、数据块交互过程 。如下图: undo数据块、undo段头块、数据块之间的关系 1、 创建cricket用户。 create user cricket identified by cricket; grant dba to cricket; 2、 创建score表。 create table score( TEAM varchar2(30), runs number, WICKETS number ) 3、 构成数据 Insert into score values(‘ENG’,841,3); Insert into score values(‘AUS’,77,8); Commit; 实验过程1、执行第一句UPDATEUpdate score set runs=77 where team =’AUS’; A、undo段头块变化情况。通过select * from v$transaction;查询活动的事务,获得事务所在undo段,以及undo块地址。本例事务所在undo段为10号段,事务槽为15号事务槽,事务槽seq为4690,undo块为3 号文件第 2950块。 Dump出undo段段头块。altersystem dump undo header ' _SYSSMU10_4131489474$'; 可以看到undo段头块事务表的第15号事务槽的state 是10,cflags是0x80,wrap是0x1213,dba为undo块地址 ,转换为文件号和块号为3+2950,内容与v$transaction反映的一致。 B、undo块变化情况。通过v$transaction可以看到该事务对应的undo块为3号文件的2950块。 Dump出该undo块: alter system dump datafile 3 block 2950。 查看undo块概况信息: Xid:事务号,xid由 undosegment no + slot no + seq no组成。 Seq:该undo块的序列号,表示该undo块被覆盖的次数。该值就是v$transaction视图中的ubaseq。 Cnt:该undo块中undo记录数。该值就是v$transaction试图中的UBAREC。 irb:表示当前事务的前进项存放的记录号,该例中可以直接到底0X2e记录上查找。 Rec:undo记录号。 Offset:偏移量。第一个offset的偏移量是4080 。 查看第0X2e个undo 记录信息: Rec #0x2e:该undo记录的号码。 Slt:事务表槽号。 Objn:对应数据块对象号。 Tblspc:对应数据块表空间号。 Col:保存前进项值。Ox4c-1=77。 Bdab:数据块地址。 Hdba:数据块所在段的段头块。 C、数据块头变化通过 rowid 可以知道数据块存放在4号文件550号块。 Dump该数据块,查看块头事务槽。altersystem dump datafile 4 block 550。 1号事务槽的Xid与undo块保存的Xid一致。Uba指向undo块,028b表示块的覆盖次数,2e表示undo记录号。Flag为----表示事务未提交。Lck为1表示有一行被锁定。 D、数据行变化查看数据块中的行信息 lb:0x1表示该行数据被1号事务槽锁定。第二列数据已经被修改Ox4c-1=75。 E、redo变化1、查找正在使用的logfile SELECT * FROM v$LOGFILEWHERE GROUP# =(Select GROUP# from v$log where status = ‘CURRENT’); 2、dump正在使用的日志文件(/u01/app/oracle/oradata/orcl/redo04.log); alter system dump logfile 'redoFile'; 找到与当前修改对象相关的内容(对象号76014)。 包含三个改变向量(CHANGE), Change1是对数据块修改的redo信息。 DBA:数据块地址。 OBJ:数据块所在对象号。 OP:11.19。表示update row array Col 1:[ 2] c1 4c 保存修改后的数据。 Chage2是对undo段头块修改参数的redo信息。 ![]() DBA:undo段头块地址。 OBJ:修改块所在对象号。 OP:5.2表示对undo段头块的修改。 UBA:undo块地址。 Change3是对undo数据块的修改。 ![]() DBA:undo块地址。 XID:事务号。 BDBA:数据块地址。 HDBA:数据块段头块地址。 UBA:undo块地址。 2、执行commit;A、undo段头块变化情况。Dump出undo段段头块。alter system dump undo header ' _SYSSMU4_1003442803$'; Commit后段头事务表如下:
Commit前段头事务表如下:
变化:事务槽15的state变成了9,cflags变为00,uel变成了无限大(ffff),scn变成了提交是的scn。 B、undo块变化情况。Dump出undo块。Dump出该undo块: alter systemdump datafile 3 block 2950。
Undo块头信息没有发生变化,直接查看0x2e号undo条目,可以发现没有任何变化。
C、数据块事务槽变化情况。 通过 rowid 可以知道数据块存放在4号文件550号块。 先刷新内存alter systemflush buffer_cache。 Dump该数据块,查看块头事务槽。altersystem dump datafile 4 block 550。 ![]() 可以看到没有变化,commit之后flag还是“--U-”, lck还是“1”,fscchans。这就是快速提交。 D、数据行变化情况。查看数据块中的行信息: ![]() lb:0x1表示该行数据被1号事务槽锁定。第二列数据已经被修改Ox4c-1=75。 E、redo变化情况。Dump出当前redo日志文件:alter system dump logfile 'redoFile'; 可以看到多了两条重做记录, 1、数据提交的重做记录,里面只有一个change: 增加的这条change为对undo段头事务表的修改产生的redo信息。OP:5.4 2、一个为写文件的重做记录 ![]() 产生了一天写入redo条目。OP:23.1 |
6.jpg (34.07 KB, 下载次数: 3)
3.jpg (69.15 KB, 下载次数: 1)
2.jpg (61.07 KB, 下载次数: 1)
1.jpg (161.05 KB, 下载次数: 1)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11693228/viewspace-1061076/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/11693228/viewspace-1061076/