Oracle redo 复杂度--oracle核心技术读书笔记三

一. 概述

我们知道,在oracle中,每修改一条数据都会生成一条重做数据(也就是redo,里面记录了修改后的内容)。目的就是为了将修改的数据备份,方便今后重做。现在有一个问题。oracle中只要修改数据,都会生成redo,这些redo会存放在一个叫做重做日志缓冲区里面。如果同时多个回话在修改数据,都要往重做日志缓冲区写入内容,就存在为同一片内存区域竞争的问题。存在竞争,就存在开销,这篇文章大概介绍一下,oracle如何尽量降低这种开销。

二.  问题概述

oracle中不断地修改数据,源源不断地生成重做日志。oracle先将这些日志写入到重做日志缓冲区(一片内存区域),然后调用LGWR进程将这些日志写入磁盘上的联机日志文件(一般是三个,一个50M的样子)。一个联机日志文件写满之后,切换到另一个日志文件。如果oracle开启了归档模式,在切换日志文件的时候,会将上一个写满的日志文件拷贝一份,叫做归档日志文件,保存到一个地方(或许是另外一台服务器,以防意外发生,方便做实例恢复或介质恢复)。看起来一切都很完美,问题就出在将日志写入到重做日志缓冲区,如果并发量大,并且每一个回话都修改很多数据,那么对重做日志缓冲区的竞争就会异常激烈。很有可能导致cpu会花费大量时间在latch自旋上(也就是占用了cpu的时间,但是cpu什么都没干)。

三. 解决方案

问题1: 一个会话不停地修改数据,需要不停地往redo buffer(重做日志缓冲区)写入内容,也就是要不断地获取redo allocation latch(保护重做日志缓冲区的一种锁,控制并发)。非常影响效率,特别是高并发的时候,你不一定能获取到锁。

这里是否可以先把所有的redo生成,然后就获取一次redo allocation latch锁?答案是可以的,oracle中10g版本之后,提供了一种 private redo,也就是为每一个事物分配一个私有的redo buffer,你先在这里生成所有的重做日志。当事务提交的时候,获取一次redo allocation latch锁,将私有redo里面的内容,拷贝到公共redo buffer里面去。

引申 问题2:如果不停地修改数据,就会不停地生成undo数据块,undo数据块的改变也会生成redo buffer。而且这些必须跟描述数据改变的redo buffer成对出现,而且必须同时写入到重做日志文件。原因如下:当将一个脏数据块,写入磁盘数据块的时候,必须要求先将对应描述这条数据改变的redo记录和记录这条数据旧数据的undo数据块对应的redo记录写入到磁盘的重做日志文件。否则就保证不了数据的一致性。oracle在没有引入private redo之前,将描述数据块改变前的undo块当做一般的数据块处理,undo块发生改变,也生成redo,同时输出到重做日志文件。以前的这种机制存在如下问题:如果另一个会话需要到undo块里面寻找旧数据,但是undo块已经被刷新输出到磁盘,那么还需要到磁盘去调取出来,存在一定的I/O开销。同时,在引入private
redo之后,无法保证描述一条数据改变的redo和undo一起刷新输出到重做日志文件。

为此,oracle引入了一个叫做IMU机制,也就是在内存区域另外为一个事务开辟一处私有的内存区域,专门用来存放描述undo数据块改变的redo记录。一个事务如果修改了10条数据,就会生成10条undo数据,从而产生10条描述undo改变的redo记录,存放在IMU里面。另外,加上描述数据本身改变的10条redo记录存放在private redo里面。总共是20条redo记录,如果事务提交的时候,就会将这20条redo记录合并成一条,从IMU和private redo拷贝到公共的redo
buffer。当然,如果事务还没有提交,但是dbwn进程需要将其中3条脏数据刷新输出到磁盘,就会从imu和private redo里面分别取到这三条记录对于的redo记录,总共6条,合并成一条,然后拷贝到公共的redo buffer,进而刷新输出到磁盘。等到redo 刷新输出到磁盘成功,dbwn才能将脏数据刷新输出到磁盘。

为此,如果我们一个事务修改了很多数据,oracle的大概操作如下:

1. 获取成对的私有内存结构(也就是private redo:用来存放描述数据块的改变 和 IMU:用来存放描述对应undo数据块的改变),开启事务

2. 修改数据,为每一个受影响的数据块打上标记(以表示“拥有私有内存结构”),但不真正改变数据。

3. 将每一条还原改变向量(也就是描述undo数据改变)写到IMU池。

4. 将每一条重做改变向量(也就是描述数据块改变)写到私有redo区。

5. 将这两个内存结构的向量合并成一条重做改变记录。

6. 将重做改变记录复制到重做日志缓冲区(也就是公共 redo buffer),并改变这个数据块。(这么看来,我上面写的,事务还没结束,dbwn进程将脏数据写入磁盘是不可能发生的,因为,最后才改变数据块)

时间: 2024-10-18 22:29:16

Oracle redo 复杂度--oracle核心技术读书笔记三的相关文章

Oracle事务原理探究1--oracle核心技术读书笔记五

1. 冲突解决 假如有一个系统只有你和我两个用户,并且我们都在持续对系统中一小部分数据做修改和查询操作. 如果你正在数据库中做一批修改操作,而我正在做查询,我一定不能看到你所做的修改,直到你告诉我可以看到你所做的所有更改才行(你提交了事务).因此在oracle内部,必须有一个高效的办法来识别哪些数据我可以看到,哪些数据我不可以看到. 从相反的角度来看,在你提交事务的时候,你需要一种高效的机制让其他所有人能够看到事务已经提交(也就是要告诉别人你所有修改过的数据都是可见的了).更极端一点的情况是,你

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①

《世界是数字的》读书笔记 三

<世界是数字的>读书笔记 三 第六章 软件系统 操作系统是软件中的基础层,他负责管理计算机硬件,并为其他被称作应用程序的程序运行提供支持. 6.1操作系统 操作系统控制和分配计算机资源.首先,他负责管理CPU,调度和协调当前运行的程序.操作系统通常都需要管理数十个同时运行的进程或任务. 其次,操作系统管理RAM.他把程序加载到内存中以便执行指令. 最后,操作系统管理和协调外接设备的活动. 6.2操作系统怎么工作 计算机启动时首先要加载代码,加载的过程中还要检查硬件,比如哪些设备已经接入电脑,,

悟道—位IT高管20年的职场心经(读书笔记三)

悟道--一位IT高管20年的职场心经 第三章 世事洞明皆学问 职场就是你的大半个世界 是你一辈子也读不完的一大本书 想明白一个道理, 看明白一件事儿, 你就向成功迈进了一步. 1.1  "四行"说 四行是指: 第一,  你自己得行.自己的基础的能力是必须的,得靠自己学习. 第二,  得有人说你行.需要有伯乐,实际上是你得有一个自己的圈子,并且这些人都人认同你. 第三,  说你行的人得行.自己周围的圈子,里面也必须有牛人,只有在牛人的范围内,才能突显你自己的才能. 第四,  你身子骨得行

《R实战》读书笔记三

第二章  创建数据集 本章概要 1探索R数据结构 2使用数据编辑器 3数据导入 4数据集标注 本章所介绍内容概括如下. 两个方面的内容. 方面一:R数据结构 方面二:进入数据或者导入数据到数据结构 理解数据集 一个数据集通常由一个表格组合而成,行表示观测,列表示变量.病人的数据集如表1所示. 表1 病人数据集 数据集能够反映数据结构.数据类型和内容. 数据结构 R数据结构如图2所示. 图2:R数据结构 数据结构即数据的组织方式,R数据结构包括向量.矩阵.数组.数据框和列表等. R向量 R向量是一

《大型网站技术架构》读书笔记三:大型网站核心架构要素

一.性能—响应时间决定用户 (1)浏览器端: ①浏览器缓存: ②使用页面压缩: PS:Gzip压缩效率非常高,通常可以达到70%的压缩率,也就是说,如果你的网页有30K,压缩之后就变成了9K左右.想要启用Gzip压缩,提高浏览速度,可以浏览这篇文章:http://www.chinaz.com/web/2012/1017/278682.shtml ③合理布局页面: CSS:把样式表置于顶部:避免使用CSS表达式(expression_r):使用外部JavaScript和CSS:削减JavaScri

《淘宝技术这十年》读书笔记 (三). 创造技术TFS和Tair

前面两篇文章介绍了淘宝的发展历程和Java时代的变迁: <淘宝技术这十年>读书笔记 (一).淘宝网技术简介及来源 <淘宝技术这十年>读书笔记 (二).Java时代的脱胎换骨和坚若磐石 马云说过"创新不是为了与对手竞争,而是跟明天竞争",所以这篇文章讲述淘宝的创新技术TFS和Tair及创新的产品. 该篇文章不仅仅对在读大学生非常有所帮助,因为你能从文章中看到很多你需要学习的知识,不仅仅包括数据库.计算机网络.操作系统.数据结构等基础课程:还根据时代的技术变迁讲述了

软件需求模式 读书笔记三

通过这一个月的阅读,我终于读完了<软件需求模模式>这本书,前两个读书笔记已经把这本书的几种模式介绍了,之前有基础需求模式,信息需求模式,数据实体需求模式,用户功能需求模式.这次介绍的是性能需求模式,适应性需求模式,访问控制需求模式和商业需求模式. 性能需求模式包括五种的性能的需求模式:影响时间(系统需要多少时间完成一个请求).动态容量(系统能够同时处理多少件事).吞吐量(系统处理时间的速率).静态容量(系统可以保存多少某种类型烦的实体)和可用性(什么时候系统对用户是可用的,以及多么可靠). 当

Struts2技术内幕 读书笔记三 表示层的困惑

表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form1" method="post" action="loginServlet"> <table width="357" border="0" align="center"> <t