原博客地址: http://blog.csdn.net/dba_waterbin/article/details/7820858
在传统的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的关系模拟出来的。他最大的关注点,就在于对回滚块的处理。
相关推荐
Oracle_Undo与Redo的通俗
oracle日志,Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。
oracle_redo_undo
这个是做实验时,简单基本的Undo、Redo的操作、在一个winForm中实现,并且可以设置Undo的最大次数。包中除了项目外,还附有报告.
本工程用vs2008打开,但需要qt库的支持,需要先安装qt-in-vs2008,才可通过编译。或者直接将里面的代码拷贝出来,然后在自己的环境中编译也行。代码中应用了QUndoCommand来实现撤销与反撤销操作。
BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行...
Oracle redo undo的说明解释
Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活...持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的实现原理及核心算法。 关键词:无限撤消/重做设计模式对象持久化批量化操作绘图CAD
实现多步Undo和Redo的方法,对于mfc绘图程序来说,这个很必要,而且很实用!
RAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和UNDO管理 收藏.docxRAC下的REDO和...
Delphi 中实现Redo Undo的一个简单实例,包含源码
针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...
cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };
Undo/Redo framework for editing controls in a Windows application 在Windows应用程序中编辑控件的撤销/重做框架。
Multiple Level Undo/Redo多级Undo/Redo功能的实现(7KB)
实现undo redo功能,多步,绘图。
Simple Undo/redo library for C#/.NET
redo undo framework source code redo undo framework source code
oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...
Arcgis Engine Undo 和 Redo 功能实现