第二十七讲--Oracle IMU及Redo Private Strands技术

Oracle传统的undo机制:

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

一个事务开始时,在一个相对空闲的undo段段头里面获得一个槽位,写上事务信息。1.段头可能不在内存里面,就需要通过IO把段头放在内存里去;2.接下来获得一个undo回滚块,可能undo回滚块不在内存里面,这是会发生IO;3.开始修改数据块,把修改前的数据写到undo回滚块里,这是oracle可能会出现rollback或者一致性读(cr块),oracle利用undo块和buffer构造cr块时,undo块可能被写到了磁盘上(oracle对待undo表空间的数据块和普通数据文件的数据块是一样的,既然是一样的,undo块极有可能被DBWR写到磁盘上),就要从磁盘上调。对undo段的IO对性能的影响很大。

        

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块也会被恢复出来;

 第二十七讲--Oracle IMU及Redo Private Strands技术_第1张图片

一个事务分配一个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日志。

你可能感兴趣的:(oracle)