本帖最后由 nvlixue 于 2014-1-8 21:33 编辑
1、什么是IMU In Memory Undo
2、IMU模式下,申请IMU POOL时会产生 IMU latch,当latch不足是,那么oracle会使用非IMU模式管理
3、alter system set"_in_memory_undo"=false; startup force; 4、 非IMU模式下当一条数据被更新的时候,会在buffer cahce中分配一个undo数据块,然后在log buffer中写入undo条目(undo的redo),如果一个事物更新多条数据,buffer cache中的undo数据块也会写入多条undo条目,同时这些undo的条目也会写入到log buffer中。 IMU模式下的话,当更新一条数据的时候,前台进程会将修改后的数据拷贝到pga,pga会拷贝数据到IMU pool(分配自shared pool),buffer cache中仍然会为undo分配一个数据块,但是修改前的数据并不会立即被写入到buffer cache中的undo 块,而是写入到IMU pool中,当发生commit的时候,才会将IMU pool中的修改前的数据写入到buffer cache中的undo块中,而IMU pool中的这些信息会被一起写入到redo log buffer中,然后通过lgwr将redo log buffer 写入到redo log file中
实验:IMU模式下redo格式分析 1、11g模式时IMU模式,切换日志、查看当前日志的序列号和current日志组
SQL> alter system switch logfile; SQL> select group#,status,sequence# fromv$log; GROUP# STATUS SEQUENCE#---------- ---------------- ---------- 1 CURRENT 28 2 INACTIVE 26 3 INACTIVE 27 SQL> select group#,member fromv$logfile; 1 /u01/app/oracle/oradata/bxocp2/redo01.log 2、 查看做实验的表t, SQL> select * from scott.t; ID NAME---------- ---------- 1 BBBB 2 BBBB 3、更新2条数据,提交,dump日志文件,获取trace SQL> UPDATE scott.t SET NAME='liHHHH'WHERE id='1'; 1 row updated. SQL> UPDATE scott.t SET NAME='WSSSH'WHERE id='2'; 1 row updated.
SQL> commit ;Commit complete. SQL> alter system dump logfile'/u01/app/oracle/oradata/bxocp2/redo01.log'; System altered. SQL> select * from v$diag_info; /u01/app/oracle/diag/rdbms/bxocp2/bxocp2/trace/bxocp2_ora_4952.trc 1、 查询表scott.t的对象id,以方便在trace文件中搜索 SQL> select object_id from user_objectswhere object_name='T'; OBJECT_ID---------- 76933 1、 分析dump文件=================== redo record 头信息=========================== REDO RECORD - Thread:1 RBA:0x00001c.0000001d.0010 LEN: 0x0314 VLD: 0x0dSCN: 0x0000.001560a9 SUBSCN: 1 01/08/2014 09:25:43(LWN RBA: 0x00001c.0000001d.0010 LEN: 0002NST: 0001 SCN: 0x0000.001560a8) RBA: 0x00001c.0000001d.0010 ( RBA = 序列号+块号+偏移量 组成) select to_number('1c','XX') from dual; select to_number('1d','XX') from dual; select to_number('10','XX') from dual; 见图片1
Dump的日志文件时序列号是28,块号29,这与上面我们通过v$log查询的结果一致 =================== redo record 头信息=========================== ==================== =========== =============================== CHANGE #1 TYP:2 CLS:1 AFN:4 DBA:0x0100021fOBJ:76933 SCN:0x0000.00156050 SEQ:4 OP:11.5 ENC:0 RBL:0KTB Redo op: 0x11 ver: 0x01 compat bit: 4 (post-11) padding: 1op: F xid: 0x0006.002.00000472 uba: 0x00c008a5.0112.01Block cleanout record, scn: 0x0000.0015609f ver: 0x01 opt: 0x02, entriesfollow... itli: 1 flg: 2 scn: 0x0000.00156050KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba:0x0100021f hdba: 0x0100021aitli: 2 ispac: 0 maxfr: 4858tabn: 0 slot: 0(0x0) flag: 0x2c lock: 2ckix: 0ncol: 2 nnew: 1 size: 2col 1: [ 6] 6c 69 48 48 48 48 OP:11.5 : update修改数据, Op code: URP :update操作OBJ:76933 这里可以看到这个obj就是我们刚才查询到的对象id DBA:0x0100021f ,data block address我们计算一下这个地址
见图片2 既然op操作时修改数据,那么我们第一条update语句是UPDATE scott.t SET NAME='liHHHH' WHEREid='1'; 结果与dump出的文件时一致的,这也验证了我们的上边操作
======================================== CHANGE #2 TYP:0 CLS:27 AFN:3 DBA:0x00c000d0OBJ:4294967295 SCN:0x0000.00156079 SEQ:1 OP:5.2 ENC:0 RBL:0ktudh redo: slt: 0x0002 sqn: 0x00000472flg: 0x000a siz: 160 fbi: 0 uba: 0x00c008a5.0112.01 pxid: 0x0000.000.00000000 OP:5.2 UNDO段头的事务表写事务信息-事务开始
AFN:3 绝对文件号3号,这里也就是undo数据文件 Select * from v$dbfile;可以查出3号文件时undo数据文件 DBA:0x00c000d0 对dba同样使用上边的文件可以得出也是3号文件 ========================================= ==================================== change #3 CHANGE #3 TYP:0 CLS:1 AFN:4 DBA:0x0100021fOBJ:76933 SCN:0x0000.001560a9 SEQ:1 OP:11.5 ENC:0 RBL:0KTB Redo op: 0x02 ver: 0x01 compat bit: 4 (post-11) padding: 1op: C uba: 0x00c008a5.0112.02KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba:0x0100021f hdba: 0x0100021aitli: 2 ispac: 0 maxfr: 4858tabn: 0 slot: 1(0x1) flag: 0x2c lock: 2ckix: 0ncol: 2 nnew: 1 size: 1col 1: [ 5] 57 53 53 53 48 OP:11.5 修改数据这里的分析同 change#1,可以发现这里是对应的t表的第二条update语句 ================================== change #3 ======= ===========================change #4 CHANGE #4 TYP:0 CLS:27 AFN:3 DBA:0x00c000d0OBJ:4294967295 SCN:0x0000.001560a9 SEQ:1 OP:5.4 ENC:0 RBL:0ktucm redo: slt: 0x0002 sqn: 0x00000472srt: 0 sta: 9 flg: 0x2 ktucf redo: uba: 0x00c008a5.0112.02 ext: 16 spc: 7894fbi: 0 OP:5.4 == commit 提交产生的日志记录 ============================= ===== change#4 ===================== =============CHANGE #5 CHANGE #5 TYP:1 CLS:28 AFN:3 DBA:0x00c008a5OBJ:4294967295 SCN:0x0000.0015609f SEQ:1 OP:5.1 ENC:0 RBL:0ktudb redo: siz: 160 spc: 0 flg: 0x000aseq: 0x0112 rec: 0x01 xid: 0x0006.002.00000472 ktubl redo: slt: 2 rci: 0 opc: 11.1 [objn:76933 objd: 76933 tsn: 4]Undo type: Regular undo Begintrans Last buffer split: No Temp Object: No Tablespace Undo: No 0x00000000 prev ctl uba:0x00c008a4.0112.05 prev ctl max cmt scn: 0x0000.0014bf8a prev tx cmt scn: 0x0000.0014bf94 txn start scn: 0x0000.00155ee6 logon user: 0 prev brb: 12585120 prev bcl: 0BuExt idx: 0 flg2: 0KDO undo record:KTB Redo op: 0x04 ver: 0x01 compat bit: 4 (post-11) padding: 1op: L itl: xid: 0x0004.001.00000312uba: 0x00c00632.008d.26 flg: C--- lkc: 0 scn: 0x0000.00156040KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba:0x0100021f hdba: 0x0100021aitli: 2 ispac: 0 maxfr: 4858tabn: 0 slot: 0(0x0) flag: 0x2c lock: 0ckix: 0ncol: 2 nnew: 1 size: -2col 1: [ 4] 42 42 42 42 OP:5.1 记录的是修改前的数据 AFN:3 绝对文件号是3号文件,也就是undo data filecol 1: [ 4] 42 42 42 42,这里可以看到也就是 BBBB,修改前的数据是BBBB,与我们之前查询t表时的数据是一致的。 ==================================CHANGE #5 ======================== ==================================CHANGE #6 CHANGE #6 TYP:0 CLS:28 AFN:3 DBA:0x00c008a5OBJ:4294967295 SCN:0x0000.001560a9 SEQ:1 OP:5.1 ENC:0 RBL:0ktudb redo: siz: 92 spc: 7988 flg: 0x0022seq: 0x0112 rec: 0x02 xid: 0x0006.002.00000472 ktubu redo: slt: 2 rci: 1 opc: 11.1 objn:76933 objd: 76933 tsn: 4Undo type: Regular undo Undo type: Last buffer split: No Tablespace Undo: No 0x00000000KDO undo record:KTB Redo op: 0x02 ver: 0x01 compat bit: 4 (post-11) padding: 1op: C uba: 0x00c008a5.0112.01KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba:0x0100021f hdba: 0x0100021aitli: 2 ispac: 0 maxfr: 4858tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0ckix: 0ncol: 2 nnew: 1 size: -1col 1: [ 4] 42 42 42 42END OF REDO DUMP Change #6 同5的分析 ==================================CHANGE #6 总结:当对t表分别作了2个update+一个commit的时候,我们dump日志发现日志内容如下 REDO RECORD CHANGE #1 ==update修改数据(第一条数据) CHANGE #2 == 记录事物开始 CHANGE #3 ==update修改数据(第二条数据) CHANGE #4 ==commit操作 CHANGE #5 == 记录修改前的数据 CHANGE #6 == 记录修改前的数据也就是产生了一个redo record 条目,6条改变向量, 修改数据(2条)+commit(1条)+修改前的数据(2条),在IMU的模式下是先记录修改的数据,commit后,在记录修改前的数据。 在非IMU模式下,产生一条redo record时: 产生一条REDO RECORD的步骤 (1) 获取redo copylatch (2) 获取redoallocate latch (3) 申请到log buffer空间 (4)释放redo allocatelatch (5)生成日志(从buffer cachecopy修改前的值,从pga中copy修改后的值),产生日志 (6)释放redo copy latch
而在IMU模式多个redo record合并成了一个 这样也就减少了以上操作,所以有利于于提高性能。
|