`
liwenshui322
  • 浏览: 519259 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

原博客地址: 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:

  1. sys@ORCL> select name,value from v$sysstat where name like '%IMU%';  
  2.   
  3. NAME                                                                  VALUE  
  4. ---------------------------------------------------------------- ----------  
  5. IMU commits                                                            3933  
  6. IMU Flushes                                                             116  

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

  1. sys@ORCL> select * from v$sgastat where name='KTI-UNDO';  
  2.   
  3. POOL         NAME                            BYTES  
  4. ------------ -------------------------- ----------  
  5. 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与Redo的通俗 Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction...

    oracle的undo与redo

    在Oracle中,日志文件发挥着关键作用,其中Undo日志和Redo日志是最核心的两种日志类型。 Undo日志,也称为撤销日志,主要用于事务处理中。它的主要作用是记录事务执行之前的数据库状态,即数据块在被修改之前的所有...

    ORACLE redo undo.docx

    Oracle redo undo 机制详解 Oracle redo undo 是 Oracle 数据库中的一种机制,用于确保事务的可恢复性和撤销性。下面是对 redo undo 机制的详细解释。 redo 机制 redo 机制是 Oracle 数据库中的一种机制,用于...

    oracle_redo_undo

    Oracle Redo 和 Undo Mechanism Oracle 中的 redo 和 undo 机制是数据库的核心组件,它们一起协作以确保数据库的事务一致性和可靠性。在本文中,我们将深入探讨 redo 和 undo 机制的工作原理和协作机制。 Undo ...

    多步Undo_Redo的实现

    ### 多步Undo/Redo实现详解 #### 一、引言 在现代软件开发中,尤其是图形编辑或文档编辑应用程序中,Undo/Redo功能是用户体验的重要组成部分。它不仅提高了用户的工作效率,还能增强软件的易用性。在本篇文章中,...

    Oracle的Temp表空间和UNDO表空间的处理

    ### Oracle的Temp表空间与UNDO表空间处理详解 #### 一、Temp表空间处理 在Oracle数据库中,Temp表空间主要用于存储临时对象,如排序、分组等操作产生的临时数据。这些操作可能会导致Temp表空间迅速增大。然而,...

    C# undo\redo框架

    本文将深入探讨“C# undo/redo框架”的核心概念、设计模式以及如何实现。 1. **命令模式**: 撤销/重做框架通常基于命令模式设计。命令模式是一种行为设计模式,将请求封装为一个对象,使发出请求与执行请求解耦。...

    QT撤消操作(undo/redo)例子

    本工程用vs2008打开,但需要qt库的支持,需要先安装qt-in-vs2008,才可通过编译。或者直接将里面的代码拷贝出来,然后在自己的环境中编译也行。代码中应用了QUndoCommand来实现撤销与反撤销操作。

    C#做的简单的Undo、Redo功能的实现

    在编程领域,撤销(Undo)和重做(Redo)功能是用户界面中常见的操作,它们允许用户取消或恢复最近的更改。在C#中,我们可以利用.NET框架提供的事件驱动和面向对象特性来实现这样的功能。这篇实验主要探讨了如何在...

    Undo_Redo机制在CAD中的应用

    Undo_Redo机制在CAD中的应用, 摘要:为了增强CAD系统的灵活...持无限Undo/Redo和批量化操作的CAD图形绘制系统,文章介绍了各模块的实现原理及核心算法。 关键词:无限撤消/重做设计模式对象持久化批量化操作绘图CAD

    脚本-Oracle释放过度使用的Undo表空间

    ### 关于Oracle释放过度使用的Undo表空间的知识点 在Oracle数据库管理中,Undo表空间扮演着极其重要的角色。它主要用于存储事务处理过程中产生的Undo记录,这些记录对于事务回滚、一致性读取以及恢复操作至关重要。...

    C#实现的undo/redo的window窗体

    针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...

    oracle undo详解

    Oracle数据库的Undo机制是其核心特性之一,它主要用于支持事务的回滚、读取一致性和闪回查询。本文将深入探讨Undo的详细功能及其优势。 首先,数据操纵语言(DML)包括INSERT、UPDATE、DELETE和MERGE等SQL语句,...

    GIS软件中undo与redo的设计与实现

    GIS软件中的Undo与Redo功能是编辑操作的重要组成部分,它们允许用户撤销和恢复之前的编辑行为。本文深入分析了GIS软件中Undo与Redo操作的设计与实现,其主要内容包括Undo与Redo操作的原理、机制、流程以及实现方法。...

    undo redo 原型设计

    cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };

    oracle undo

    Oracle UNDO 机制详解 Oracle UNDO 机制是 Oracle 数据库中的一种重要机制,用于记录和回滚事务的操作。UNDO 段是 Oracle 数据库中的一种特殊类型的段,用于存储事务的回滚信息。 undo 段的介绍 undo 段是 ...

    ORACLE的UNDO表空间

    ORACLE的UNDO表空间 ORACLE的UNDO表空间是Oracle数据库中一个非常重要的组件,playing a crucial role in maintaining data consistency and providing a way to undo changes made to the database. 在本节中,...

    seata-oracle版undolog.sql

    oracle版本的undolog建表语句。 2019 年 1 月,阿里巴巴中间件团队发起了开源项目 Fescar(Fast & EaSy Commit And Rollback),和社区一起共建开源分布式事务解决方案。Fescar 的愿景是让分布式事务的使用像本地...

    redo undo framework source code

    在IT行业中,"redo undo"框架是用于实现撤销/重做功能的核心技术,常见于各种软件和应用程序中,如文本编辑器、图像处理软件、数据库系统等。它允许用户取消最近的操作并恢复先前的状态,提供了对用户交互的强大支持...

Global site tag (gtag.js) - Google Analytics