您好,欢迎访问一九零五行业门户网

undo系列学习之Oracle IMU及Redo Private Strands技术

在传统的undo管理模式中,oracle对undo和data block是一视同仁。这样大致会有三种弊端:1)事务开始时,存放事务表的段头不在内存
在传统的undo管理模式中,oracle对undo和data block是一视同仁。这样大致会有三种弊端:
1)事务开始时,存放事务表的段头不在内存,server process需要将此i/o上来
2)存放旧值的回滚块不在内存
3)rollback或者cr读的时候,所需的回滚块被dbwn写到磁盘,oracle也需将此i/o,可能会产生大量的consistent gets和physical reads
由此,我们知道,undo会产生redo,又会写undo segment,进而可能产生大量的i/o。undo也是expensive的。
10g新特性:imu机制
imu在shared pool里面分配一片imu pool,用来缓存回滚块。每个新事务都会分配一个imu buffer(私有的),一个buffer里有很多node,一个node相当于一个block(回滚块)。好处大致有二:
1)提高cr读的速度
2)减少i/o
我们可以借助v$sysstat查询oracle是否启用了imu:
我们还可以借助v$sgastat查询系统当前分配的imu内存:
如果imu commits和imu flushes一直在增长,则表明oracle正在使用imu。
传统的undo管理图如下:
imu模式下,undo信息依然会被redo保护,因为instance recovery需要undo信息去回滚未提交的事务,使数据库处于一致性状态,如果redo没有保护好undo,那么一旦instance crash,数据库有可能处于不一致状态。
事务开始时,依旧会在数据块头部分配itl,并且,,他依然会指向undo segment header的事务表,但是回滚块的信息不需要马上写入。这时,undo数据是被记录在imu buffer里面,这个行为不被redo保护。在以下两种情况,undo数据会被写到回滚块:
1)imu buffer空间不足时,会发生imu flush,将undo flush到database_buffer_cache里的回滚块中
2)lgwr将redo写到redo log file时,会发生imu commit,将private redo strands写到redo log file,将imu buffer写到回滚块
当imu buffer flush到回滚块时,oracle会进行合并处理,减少回滚块的消耗以及redo的产生。
在10g开始,同时会在shared pool里,分配一个private redo buffer,每个事务产生的redo都会放在这里
有了private redo strands机制,针对imu buffer产生的日志,就直接在shared pool里面记录。
注意了,在rac和streams里面,imu缺省是false的!
imu及redo private strands技术,其实,是参考了redo log buffer和database_buffer_cache的关系模拟出来的。他最大的关注点,就在于对回滚块的处理。
其它类似信息

推荐信息