Oracle学习笔记 Oracle IMU及Redo Private Strands技术

来源:互联网 发布:淘宝秋水兰熙旗舰店 编辑:程序博客网 时间:2024/05/21 13:21

Oracle 学习笔记 Oracle IMU及Redo Private Strands技术

这节看一下undo里面一个新的机制叫IMU机制

先简单回顾一下oracle的传统的undo机制以及它所面临的问题

一)传统的undo块

在传统里面oracle对待undo表空间和普通表空间它是一视同仁的都一样的

一个事务开始的时候
在一个相对空闲的undo回滚段的段头的事务表里面获得一个槽位
把事务信息写上

有可能

第一、段头块发生IO
这个段头不在内存里面
就需要通过io把它放到内存里面去

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

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

在这个时候oracle可能出现rollback或者一致性读
要读数据块和回滚块

有可能oracle在cr的时候在构造一致性块的时候
要读某个回滚块的时候,这个回滚块已被写到了磁盘上

oracle在对待undo表空间中的block即undo表空间的数据块的时候
和对待普通的数据文件的数据块的时候是一样的
既然一样它就有可能被dbwr写到磁盘上

既然写到磁盘上了它就成干净了
既然干净了它就可能被再次使用
被使用被覆盖以后
下次再使用这个undoblock的时候就需要重新从磁盘调

在传统的undo的技术里面
oracle将undo表空间和普通表空间等同的对待
所以存在刚才重新从磁盘调的问题

undo对系统的影响很大
有可能导致数据库系统的性能变得慢一些
这是传统的undo技术可能会带来的问题

二)IMU技术产生原因

oracle根据使用undo块需从磁盘调取的问题推出一个技术叫IMU技术
IMU(In Memory Undo)

在使用IMU和不使用IMU的结构里面
undo段以及段头的事务表都是有的
唯一不同的地方有了IMU buffer

IMU机制和普通机制不同

针对每一个事务
oracle在sharedpool中分配一个IMU buffer
这个buffer用来记回滚数据且只记回滚数据

以前回滚数据在回滚段里面
我们要使用回滚段的时候需要去buffercache找一个buffer
这个buffer没有的话需要从磁盘调进来,需要物理io

oracle使不使用IMU主要影响的不是回滚段段头和事务槽
它们该怎么用怎么用,该怎么获取还怎么获取
唯一不同的地方是回滚块
原来是当事务需要回滚块的时候去undo表空间找回滚块
会发生物理io

现在oracle一个事务开始的时候
在sharedpool里面分一个IMUbuffer
然后将所有的回滚信息全部写到IMUbuffer里面去
这个IMU buffer是凭空从sharedpool分出来的
不是从undo表空间提出来的块

对oracle来讲只要是使用了imubuffer
当它需要回滚块的时候不需要读磁盘
直接从sharedpool里面分IMUbuffer
然后回滚信息写到IMU buffer里面去

记住imubuffer分配以后
回滚信息往里写的时候也要产生redo
因为回滚数据需要写redo

但是imubuffer减少了物理io
它直接分配imubuffer

这就是imu技术的一个特点
也就是最核心的东西
一个事务开始以后
当它需要回滚块的时候
它不是从磁盘调取回滚块,它直接分配imu buffer,直接往里写数据
别的都一样

三)IMU作用

被修改的数据块指向imu buffer

这里修改了三个块
产生了三个imu node,它们组成imu buffer

将来

第一、我回滚的时候
回滚数据直接从内存里IMU用就可以了

IMU不会写到磁盘上,始终在内存里面

第二、产生一致性读的时候
直接用imu buffer就行了

第三、imu node也产生redo
既然产生redo了
实例崩溃以后这些块也会被恢复出来,也可以实例恢复

sharedpool里面有imubuffer
一个事务分配一个imubuffer
一个buffer里面会有很多的node
一个node就相当于一个block

四)Private Redo Strands

这里有三个imubuffer
就是有三个事务

根据三个事务在sharedpool里面又分了三个日志区
日志区针对每个imu buffer产生的日志
直接在sharedpool里面叫Private Redo Strands

imubuffer修改产生的日志
直接写到对应的那个Private Redo Strands日志区里面去

原来的日志是在pga里面产生然后写到logbuffer里面去,再写到redolog里面

针对imubuffer产生的日志不是在pga里面产生的
是在private redo strands针对每个buffer产生一个日志区

针对imubuffer产生日志写到日志区
最终由lgwr写到磁盘上

private redo机制是配合imu buffer
这两个东西都是在sharedpool产生

imu好因为减少物理io,提高了对undo的使用效率

五)IMU最终去处

imu buffer在sharedpool产生的日志
针对imu专门产生的日志用lgwr写到磁盘

imubuffer里面的数据写满的时候
这些数据会被写到undoblock里面去
最终它还要被写到SGA的buffer cache中的undobuffer里面去
从undobuffer再写到磁盘上

也就是最终我的undo数据还是要保存到undo段里面

undo数据产生在imu里面
但是imu是个缓存,将来数据库关了缓存就没了
其实最终的undo数据
是由imu写到buffercache,然后buffercache再写到undo段里面去
最终还要写回磁盘来

从imubuffer往buffercache里面写的时候还会继续产生日志
写这个日志比Private Redo日志就少多了,它进行了优化和合并

imu和private redo strands两个机制合起来带来的好处
第一、事务在获取undoblock的时候速度变快
第二、在cr读的时候速度变快
特别是对cr读,imubuffer这个技术非常的好
imu可以大幅的提高我们cr读一致性读的速度

这就是我们为什么使用imu技术

六)判断IMU是否启用

oracle对imu会自动的启用和关闭

我们使用语句
select * from v$sysstat where name like ‘%IMU%’;
查和imu相关的一些数值

结果

SQL> select * from v$sysstat where name like '%IMU%';STATISTIC# NAME                                          CLASS      VALUE    STAT_ID---------- ---------------------------------------- ---------- ---------- ----------       230 IMU commits                                     128       9564 1914489094       231 IMU Flushes                                     128      21577 2099506212       232 IMU contention                                  128         31 2909373607       233 IMU recursive-transaction flush                 128         19 2591100633       234 IMU undo retention flush                        128          0 2087226422       235 IMU ktichg flush                                128          0 1206609541       236 IMU bind flushes                                128          0 2756376339       237 IMU mbu flush                                   128          0 3723686946       238 IMU pool not allocated                          128       2957  659017805       239 IMU CR rollbacks                                128       1158 2225124543       240 IMU undo allocation size                        128   43425124  244193920       241 IMU Redo allocation size                        128   11598436 3945654623       242 IMU- failed to get a private strand             128       2957 241286354513 rows selected.

查出了当前一些和imu相关的一些数值
过段时间再查一次

SQL> select * from v$sysstat where name like '%IMU%';STATISTIC# NAME                                          CLASS      VALUE    STAT_ID---------- ---------------------------------------- ---------- ---------- ----------       230 IMU commits                                     128       9670 1914489094       231 IMU Flushes                                     128      21717 2099506212       232 IMU contention                                  128         31 2909373607       233 IMU recursive-transaction flush                 128         20 2591100633       234 IMU undo retention flush                        128          0 2087226422       235 IMU ktichg flush                                128          0 1206609541       236 IMU bind flushes                                128          0 2756376339       237 IMU mbu flush                                   128          0 3723686946       238 IMU pool not allocated                          128       2957  659017805       239 IMU CR rollbacks                                128       1162 2225124543       240 IMU undo allocation size                        128   43919548  244193920       241 IMU Redo allocation size                        128   11745848 3945654623       242 IMU- failed to get a private strand             128       2957 241286354513 rows selected.

如IMU commits和IMU Flushes这两个统计属性的VALUE
这两个值

第一次结果

   230 IMU commits                                     128       9564 1914489094   231 IMU Flushes                                     128      21577 2099506212

第二次结果

   230 IMU commits                                     128       9670 1914489094   231 IMU Flushes                                     128      21717 2099506212

比较看出数值正在增加
这样不停地增加的话说明oracle的imu机制是启用了

IMU Flushes:
当sharedpool里面的imubuffer快满了的时候
它会往buffercache里面写,就是imu Flushe

IMU commits:
当事务提交的时候当commit的时候
sharedpool中imu的日志会往磁盘写,imu也往buffercache中写
这叫IMU commit

只要这两个值存在增加,说明oracle在使用imu技术

在rac和stream里面imu是被禁止的,被自动禁掉了
目前为止
imu技术没有被oracle大张旗鼓的去宣扬,说明它带来的性能还是有限的
总之大家只要知道这个技术就行了

这两个技术
Oracle IMU机制
Oracle private redo strands机制
合起来使用
带来最大的好处是:oracle构造cr块的速度明显变快

七)什么是新技术

这节课老师讲了一个oracle中出现的新技术
不管它新不新它是一个技术
在这里描述一下计算机新技术

技术这个词对我们来说是非常熟悉的,在生活工作中很多方面经常地碰到
对这个词有很多种解释,不一而同

其实把技术这个词拆开,就可以知道它的含义

技:是人在劳动中改造事务或制造事务的一系列行为
术:是系统化了的实现目的的方法
技术就是一种行为方法

它的基础是积累过的知识,表现出来是有目的的行为,用来作用于事物,最终产生出一个结果
技术是否可用或它实现的程度及影响的好坏以结果为标准

技术是在劳动实践中人们总结或创造出来的,并最终将它使用到实践中
它有它产生的基础和作用的范围
更换了作用基础或超出了能力范围,它会失去作用,更可能的是产生坏的作用。

每个技术都由人来执行,人不同,能力和掌握程度有差别
影响到技术可否执行和执行的程度和执行的效率

处理同一件事可能有很多不同的技术
都同样是人们的总结,但包含的行为和方法会有所区别

技术是用来满足某种需要并逐渐形成的
用来节约劳动力和产生更高级的产品

同一个实现目标,会有高级的和低级的实现方式
就是技术本身有高级和低级之分

一个高级技术
往往建立在很多的低级技术的累积和组合之上
或者它处理的事物较高级,在一个层级较高的地方

每个技术要形成都有一个在不断实践中的沉积过程
起因往往是解决一个片面的问题
技术有高低之分,作用有好坏之别

技术没有万能的
在使用时仔细认真的推衍,一般都会产生错误
都会有不好的结果和碰到很多它解决不了的事情

一个技术只能说它能做到什么,而绝大部分是它做不到的

而新技术是在已有技术上产生出来的
目的同样也是为了解决一个具体的问题
内容有的有创新而大部分只能说是对原来的技术进行了一些重组
新技术同样有高低之分,作用也有好坏之分

计算机中包含的已有技术很多
有一个产生新技术的很好的温床
新技术自然的前仆后继地产生

其中最好的技术是对计算机本身全面的了解后
总结了前人的成就
权衡过使用中的各种消耗
而又尽量避免对计算机系统的损毁
并经过无数的实践
一步步的积累沉淀产生的

而一般情况下这种好的新技术是很难产生的

在计算机中常发生这种情况
一个所谓新技术出现后
在使用了一段时间后
发现这个技术早已经有了

一个新技术出现一般的情况是这样的

在它解决一个片面问题时,不想已破坏了其它方面的稳定
或者问题从根本上并没有解决
或者一个技术从头至尾只是个设想,纸上谈兵,连一个实现的结果都没有就推出了
当然这种虚构的技术什么也做不了

一个再成功的计算机技术
对计算机也只有片面的提升,并且只解决了片面的问题

一个不太好的新技术
从表面看也许没有毛病,它宣称解决了一件事情
并且往往在执行时也许达到了某个目标
但最常同时发生的事是影响了计算机的其它方面或带来了破坏

有人觉得计算机是万能的,什么都可以解决
有些问题没有解决只是没有相关的技术

事实并非如此
计算机从硬件来讲本身它是有限的

有有限的存储空间、有限的功能、有限的性能

从软件来说也是有限的

有限的数字范围、有限的指令个数、有限的程序长度

所以这些有限的资源不是什么事都可以解决
而是绝大部分事它做不了

比如计算机中的资源耗尽的问题从来就没有人解决了
包括内存耗尽、存储耗尽、cpu耗尽基本不能解决
所有的解决办法都是尽可能的缓解

一个技术是不是一个有用的好的技术
需等待这个技术在实践中沉积
看它最终停在什么位置
有可能被埋没,有可能消失了
最好的结果它停在了人们的视线中
这样一个新技术就产生了

做一个自己认为的新技术并不难
而做一个被人们接受的新技术是个很困难的事,它是计算机人员的一个梦想

2017年8月28日
文字:韵筝