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

Oracle 10g引入的IMU(In-Memory Undo)机制优化了undo管理,通过在Shared Pool中缓存回滚块来减少I/O并提升CR读速度。同时,Redo Private Strands在Shared Pool中为每个事务分配私有redo缓冲区,直接记录undo日志,降低数据库的磁盘操作。这两种技术旨在改善事务处理效率和数据库一致性。在RAC和Streams环境中,IMU默认关闭。
摘要由CSDN通过智能技术生成

    在传统的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:

sys@ORCL> select name,value from v$sysstat where name like '%IMU%';

NAME                                                                  VALUE
---------------------------------------------------------------- ----------
IMU commits                                                            3933
IMU Flushes                                                             116

    我们还可以借助v$sgastat查询系统当前分配的IMU内存:

sys@ORCL> select * from v$sgastat where name='KTI-UNDO';

POOL         NAME                            BYTES
------------ -------------------------- ----------
shared pool  KTI-UNDO                      1235304

 

    如果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的关系模拟出来的。他最大的关注点,就在于对回滚块的处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值