Oracle内核管理-事务IMU

Oracle传统的undo机制:

在传统里面oracle对undo表空间和普通表空间是一视同仁的。都是在buffer cache里面分配内存区,都是用DBWR进程定时写到磁盘上。
一个事务开始时,

在一个相对空闲的undo段段头里面获得一个槽位,写上事务信息

1.段头可能不在内存里面,就需要通过IO把段头放在内存里去;

2.接下来获得一个undo回滚块,可能undo回滚块不在内存里面,这是会发生IO;

3.开始修改数据块,把修改前的数据写到undo回滚块(update 原来的值在PGA)里,

这是oracle可能会出现rollback或者一致性读(cr块),oracle利用undo块和buffer构造cr块时,undo块可能被写到了磁盘上(oracle对待undo表空间的数据块和普通数据文件的数据块是一样的,既然是一样的,undo块极有可能被DBWR写到磁盘上),就要从磁盘上调。对undo段的IO对性能的影响很大。


2 IMU(In Memory Undo)技术:


 在以前,回滚数据在undo段里面,当我们要使用回滚段的时候,需要去找一个buffer(undo buffer)如果内存中没有的话,就要从磁盘调进来,就要发生物理IO。
针对每一个事务,oracle在shared pool中分配一个IMUbuffer,IMU buffer值用来记录回滚数据。Oracle使用IMU不是针对回滚段段头,也不是事务槽,而是回滚块。IMU buffer分配以后,往IMU buffer写回滚信息时也要产生redo。IMU buffer减少了物理IO。

使用IMU技术的好处:
1.      回滚的时候,直接从内存中用IMU buffer就可以了,不要调磁盘;
2.      产生一致性读(构造cr块)的时候直接用IMU buffer;
3.      IMU buffer的数据也产生redo,实例崩溃恢复时,IMUbuffer块也会被恢复出来;

————————————————

一个事务分配一个IMU buffer(shared pool中三个黄色方格代表三个IMUbuffer),上图中有三个事务,根据三个事务,oracle又在shared pool里面分了三个日志区(shared pool中三个红色方格)。针对每个IMU buffer,其日志直接在shared pool中产生,叫做private redo strands。原来的日志是在PGA里面产生,然后写到log buffer(内存),再写到redo log中。针对IMU buffer的日志是在private redo strands里产生。Private
 redo strands是内容也是由LGWR写到磁盘上。
IMU buffer里面的数据写满的时候,这些数据会被写到undo buffer里面去,然后由DBWR把undo buffer的数据写到磁盘上。也就是说,最终,undo数据还是要保存在undo段里面。从IMU buffer写到undo buffer的时候还是会产生redo日志。
————————————————
版权声明:本文为CSDN博主「chengonghao」的原创文章,遵循CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengonghao/article/details/50954063

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值