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. QFileDialog实现同时选择文件和文件夹,确认取消按钮英文问题解决方法

    如下图所示,需求是同时能够选择文件或者文件夹,但是QFileDialog文件窗口类要么只能选文件,要么只能选文件夹,无法同时去选择文件和文件夹: 要实现这样的需求,封装了一个类,实现同时选择文件和文件 ...

  2. 基于ArcGIS的三维路网可视化

    1. 引言 ArcGIS作为GIS的集大成者,对于三维可视化方面也有集成,参考自:3D 折线 (polyline) 要素-ArcMap | 文档 (arcgis.com),可以使用ArcGIS来构造与 ...

  3. postgresql中条件表达式 coalesce、nullif 、greatest、least

    一.postgresql中条件表达式 1.1 GREATEST和LEASTGREATEST(value [, ...]) LEAST(value [, ...])# 注意比较值得类型一定要相同案例:比 ...

  4. vscode cmake工程launch和task文件设置

    1.launch.json文件基本设置 { // Use IntelliSense to learn about possible attributes. // Hover to view descr ...

  5. 零基础小白速成python?有了这本书你还在担心什么?

    <Python编程快速上手>书籍PDF高清版免费下载地址 提取码:bc9h 内容简介  · · · · · · 如今,人们面临的大多数任务都可以通过编写计算机软件来完成.Python是一种 ...

  6. Windows10安装VMware

    系统环境: Windows 10 安装步骤: 1.下载vmware https://my.vmware.com/cn/web/vmware/downloads 2.安装(这里安装语言我选择的是中文) ...

  7. D. Triangle Coloring

    https://codeforces.com/contest/1795/problem/D #include <iostream> #include <cstring> #in ...

  8. JavaScript 数字与字符串的加减乘除运算

    点击跳转 Tips: 除开字符串 + 数字的运算,会产生级联,其他情况下会将 String 转为 number 再进行数字运算. js 运算是从左到右的,所以一步一步来,不要跳步进行运算.

  9. Windows 与Docker

    https://docs.microsoft.com/zh-cn/windows/wsl/install-manual#step-4---download-the-linux-kernel-updat ...

  10. Hive基本概念

    Hive Hive的相关概念 Hive的架构图 用户接口:包括 CLI.JDBC/ODBC.WebGUI.其中,CLI(command line interface)为shell命令行:Hive中的T ...