1、传统undo块

在传统情况下Oracle对待undo表空间和普通表空间是一视同仁的,一个事务开始的时候,在相对空闲的undo回滚段的段头块的事务表获取一个槽位,把事务信息写上,有可能:

1.1、段头块发生IO,这个段不在内存里面,就需要通过IO把他放到内存里

1.2、新的回滚块发生IO,又获得一个undo回滚块,有可能undo回滚块不在内存里面,需要发生IO

1.3、正在使用的回滚块发生IO,开始修改数据库,把信息写到回滚块里

在以上这个时候可能出现rollback或者一致性读,要读数据块和回滚块,有可能Oracle在cr的是在构造一致性读块的时候,要读回滚块的时候,这个回滚块已被写到磁盘上,Oracle在对待undo表空间找那个的block即undo表空间的数据块的时候,和对待普通数据文件的数据块是一样的,既然一样它就有可能被dbwr写到磁盘上。被写到磁盘就是干净的buffer,它可能被再次使用,被覆盖掉,下次使用Undo block的时候就需要重新从磁盘上读取。在传统的undo技术里,Oracle将undo表空间和普通表空间同等对待,所以存在刚才重新从磁盘调取的,undo对系统的影响很大,有可能导致数据库系统的性能变得慢一些,这个是传统的劣势。

2、IMU技术产生原因

Oracle根据使用undo块需从磁盘读取的问题推出一个技术较IMU技术(in memory undo),在使用IMU和不使用IMUS的结构里面,undo段以及段头的事务表都有的,唯一不同的地方有了IMU buffer,IMU机制和普通的机制不同,针对每个事务,Oracle在shared pool中分配一个IMU buffer,这个buffer用来记录回滚数据且只记回滚数据。

以前回滚数据在回滚段里面,我们要使用回滚段的时候需要去buffer cache找回滚数据的buffer,这个buffer没有的话需要从磁盘调,需要物流IO(在buffer里没有可用的回滚段缓存的数据块的话,需要找一个undo块缓存到buffer里,这时会有IO,当CR读的时候,这个undo块被写到磁盘,buffer里的这个块也被覆盖后,这时也需要重新读回滚块,发送物流IO)。Oracle使不使用IMU主要影响的不是回滚段段头和事务槽,他们该怎么用还是怎么用,该怎么获取怎么获取,唯一不同的地方是回滚块,原来是当事务需要回滚块的时候去undo表空间找回滚块,会发生物流IO。

现在Oracle一个事务开始的时候,在shared pool里面分一个IMU buffer,然后将所有的回滚信息全部写到IMU buffer里面去,这个IMU buffer是凭空从shared pool

分出来的,不是undo表空间读出来的块。对oracle来讲只要是使用了IMU buffer,当它需要回滚块的时候不需要读undo表空间了,直接从shared pool里面分出IMU buffer,然后回滚信息写到IMU buffer里面去,记住IMU buffer分配以后,回滚信息往里写的时候也要产生redo,因为回滚信息数据写redo,但是IMU buffer减少了物理IO,这就是IMU技术的一个特点,也就是最核心的东西,一个事务开始以后,它需要回滚块的时候,它不是从磁盘读取回滚块,它直接分配imu buffer,直接往里写数据,其他工作方式一样。

3、imu的作用

被修改的数据块指向imu buffer,这个事务修改三个块,产生三个imu node,他们组成imu buffer。

1)回滚的时候,回顾数据直接从内存里IMU调用就可以了,imu不会写到磁盘上,始终在内存里面。(此处可能有误)

2)产生一致性读的时候,直接用imu buffer里的镜像原数据就可以了。

3)imu node也产生redo,既然产生redo,实例崩溃以后这些块也会被恢复处理,也可以实例恢复。

shared pool里面有imu buffer,一个事务分配一个imu buffer,一个buffer里面会有很多node,一个node就相当于一个block。

4、private redo strands

有三个imu buffer,就有三个事务,根据三个事务在shared pool里又分了三个日志去,日志区针对每个imu buffer产生日志,直接在shared pool里面叫private redo strands。imu buffer修改产生的日志,直接写到对应的那个private redo strands日志区里面去,原理的redo日志实在pga里面产生,然后写到log  buffer里面去,再写到redo log日志文件里面去的。针对imu buffer产生的日志不是在pga中,是在private redo strands针对每个imu buffer所产生的一个日志区,日志去的日志内容最终由lgwr写到磁盘。

private redo 机制是配合imu buffer,这个两个都是在shared pool中,imu减少物理IO,提升undo的使用效率。

5、imu最终去处

imu buffer在shared pool产生的日志,用lgwr写到磁盘上,imu buffer里的数据写满的时候,这些数据会被写到undo block里面去,最终它还是要被写到sga的buffer cache里面去,再从undo buffer写到磁盘上。也就是说最终undo数据还是要保存到undo段里面。

产生在imu里的undo数据,imu是个缓存,将来数据库关了缓存就没有了,其实最终的undo数据,是由imu写到buffer cache,然后buffer cache再写到undo段里面去,最终还要写会磁盘。从imu buffer往buffer cache里面写的时候还会继续产生日志,写这个日志比private redo日志就少多了,它进行了优化和合并。

imu和private redo strands两个机制合起来带来的好处:

1)事务在获取undo block的时候速度变快。直接从shared pool的imu中分配块

2)在cr读的时候速度变快,针对cr读,imu可以大幅提高读一致性的速度,但是如果一个事务修改的数据块实在太多的时候,可能存在需要构造的块的镜像数据已经写到undo段里了。

6、如何判断imu是否启用

oracle对imu会自动启用和关闭

使用语句查看一些数值:

select * from v$sysstat where name like '%IMU%';隔断时间查询该语句,比较 commit和flushes的数值,如果一直在增加的话就是启用状态。

MU flushes:当shared pool里面的imu buffer快满了的时候,它会往buffer cache里面写,这个过程就是imu flushes。
IMU commit:当事务提交的时候,shared pool中imu的日志会往磁盘写,imu也往buffer cache中写。
在Rac和和stream里面IMU是被禁用的。

Oracle学习undo之IMU机制的更多相关文章

  1. [Oracle] Redo&Undo梳理

    Oracle Redo&undo Oracle中的redo和undo是关键技术的核心, 诸如实例恢复, 介质恢复, DataGuard, 闪回机制等都是给予redo和undo的, 所以很有必要 ...

  2. Oracle学习线路

    出自huyangg的博客,地址是:oracle学习路线图 1.sql.pl/sql(网上有很多的视频,可以做一个简单的入手,然后看几本书,多做实验)    作为oracle的基本功,需要大家对sql和 ...

  3. 学习笔记:oracle学习一:oracle11g体系结构之体系结构概述和逻辑存储结构

    目录 1.oracle 11g体系结构概述 1.1 三个重要概念 1.2 oracle数据库存储结构 2 逻辑存储结构 2.1 数据块(Data Blocks) 2.2 数据区(Extent) 2.3 ...

  4. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  5. Oracle学习指南

    Oracle学习指南 你走的那天,我决定不落泪,迎着风撑着眼帘用力不眨眼 创建数据库.创建用户.创建表空间.创建表.插入数据..... 1.用系统用户登录,任选系统用户 代码: >>sql ...

  6. 记一次ORACLE的UNDO表空间爆满分析过程

    这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...

  7. 九、Android学习第八天——广播机制与WIFI网络操作(转)

    (转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...

  8. Oracle学习系列1-7

    Oracle学习系列1 两个服务必须启动: OracleOraDb10g*TNListener 和 OracleService*** 使用sqlplusw先进行环境的设置 set linesize 3 ...

  9. Oracle学习系列7

    Oracle学习系列7 ************************************************************************************ 关联表 ...

  10. Oracle学习系列6

    Oracle学习系列6 ************************************************************************************ 删除约 ...

随机推荐

  1. element-ui/lib/style.css in ./src/main.js 解决方案

    在node_modules 中    找到element-ui/lib路径 创建style.css文件   就好了

  2. 地理探测器简介(R语言)

    地理探测器 1. 地理探测器原理 空间分异性是地理现象的基本特点之一.地理探测器是探测和利用空间分异性的工具.地理探测器包括4个探测器. 分异及因子探测:探测Y的空间分异性:以及探测某因子X多大程度上 ...

  3. Apache Maven Assembly自定义打包插件的使用

    前言 本文主要记录在SpringBoot项目中使用Apache Maven Assembly插件进行打包的相关内容: 官网说明:https://maven.apache.org/plugins/mav ...

  4. C语言学习--结构体指针

    #include<stdio.h> #include<string.h> //结构体指针: 指针的类型为结构体 typedef struct nodeData { int a; ...

  5. 报错解决:DENIED Redis正在保护模式下运行

    DENIED Redis正在保护模式下运行,因为已启用保护模式,未指定绑定地址,也未向客户端请求身份验证密码.在此模式下,仅接受环回接口的连接.如果您想从外部计算机连接到Redis,您可以采用以下解决 ...

  6. libuv 网络库设计概览译

    设计概览 libuv 是一种支持跨平台的网络库,最初是为了NodeJS作为某个模块实现的,主要基于事件驱动的I/O 模型设计的. 这个库不仅仅对不同的I/O polling 机制提供简单的抽象. ha ...

  7. virtualenvwrapper使用命令

    virtualenvwrapper使用命令 创建虚拟环境:mkvirtualenv + test1 查看虚拟环境:lsvirtuslenv 删除虚拟环境:rmvirtualenv + test1 退出 ...

  8. 225-基于XCVU440T的多核处理器多输入芯片验证板卡

    225-基于XCVU440T的多核处理器多输入芯片验证板卡   基于XCVU440T的多核处理器多输入芯片验证板卡 一.板卡概述 本板卡系我司自主研发的基于6U CPCI处理板,适用于多核处理器多输入 ...

  9. Mybatis 中传入List实现 批量插入、批量更新、批量删除

    1. 批量插入: Mapper层: int insertList(List<UsersModel> list); 对应的mapper.xml: <!--批量插入信息--> &l ...

  10. allure+junit5遇到的一些问题

    java+junit5+allure 之前引testng,还比较顺利,见上一篇博客,然后testng的注解和junit不一样,感觉junit5更好用一些,所以尝试java+junit5+allure ...