Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1172106
  • 博文数量: 178
  • 博客积分: 2776
  • 博客等级: 少校
  • 技术积分: 2809
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-22 15:36
文章分类

全部博文(178)

文章存档

2014年(3)

2013年(66)

2012年(109)

分类: Oracle

2012-08-02 17:06:33

  IMU在shared pool里面分配一片IMU pool,用来缓存回滚块.每个新事务都会分配一个IMU buffer(私有的),一个buffer里有很多node,一个node相当于一个block(回滚块).好处大致有二:


  1)提高CR读的速度


  2)减少I/O


  我们可以借助v$sysstat查询Oracle是否启用了IMU:


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


  NAME                                                                  VALUE


  ---------------------------------------------------------------- ----------


  IMU commits                                                            3933


  IMU Flushes                                                             116


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


  > 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 10g会进行合并处理,减少回滚块的消耗以及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的关系模拟出来的.他最大的关注点,就在于对回滚块的处理.

阅读(1082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~