oracle深度解析检查点

由于中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:

  1、完全检查点

  在Oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:

  (1)DBA手工执行alter system checkpoint的命令;

  (2)数据库正常shutdown(immediate,transcational,normal)。

  由于完全检查点会将所有的脏数据库块写入,巨大的IO往往会影响到数据库的性能。因此Oracle从8i开始引入了增量检查点的概念。

  2、增量检查点

  Oracle 从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,DBWR 根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含RBA(Redo Block Address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的RBA,从而保证最早更改的数据块能够尽快写入。当DBWR将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,CKPT每三秒会在控制文件中记录检查点的位置,以表示Instance Recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,Oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。

  (1)fast_start_io_target

  该参数用于表示数据库发生Instance Recovery的时候需要产生的IO总数,它通过v$filestat的AVGIOTIM来估算的。比如我们一个数据库在发生Instance Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance Recovery的时候大概将产生5001060=30,000次IO,也就是我们将可以把fast_start_io_target设置为 30000。

  (2)fast_start_mttr_target

  我们从上面可以看到fast_start_io_target 来估算检查点位置比较麻烦。Oracle为了简化这个概念,从9i开始引入了 fast_start_mttr_target这么一个参数,用于表示数据库发生Instance Recovery的时间,以秒为单位。这个参数我们从字面上也比较好理解,其中的mttr是mean time to recovery的简写,如上例中的情况我们可以将fast_start_mttr_target设置为600。当设置了 fast_start_mttr_target后,fast_start_io_target这个参数将不再生效,从9i后 fast_start_io_target这个参数被Oracle废除了。

  (3)log_checkpoint_timeout

  该参数用于表示检查点位置和重做日志文件末尾之间的时间间隔,以秒为单位,默认情况下是1800秒。

  (4)log_checkpoint_interval

  该参数是表示检查点位置和重做日志末尾的重做日志块的数量,以OS块表示。

  (5)90% OF SMALLEST REDO LOG

  除了以上4个初始化参数外,Oracle内部事实上还将重做日志文件末尾前面90%的位置设为检查点位置。在每个重做日志中,这么几个参数指定的位置可能不尽相同,Oracle将离日志文件末尾最近的那个位置确认为检查点位置。

  oracle 9i instance recovery

  1、增量检查点

  在checkpoint queue的基础上实现了增量检查点,每3秒发生一次checkpoint heartbeat,记录dbwr上次写成功的最大RBA(redo block address)。这样的话做instance recovery的时候就从这个rba开始,而不是从上次checkpoint scn开始,大大节省了恢复时间。

2、twice scan of redo log

  在应用redo之前,redo将会被操作两次,第一次去扫描哪些redo record需要被应用,因为9i在redo里添加了dbwr写数据块的信息,所以dbwr发生前的日志将不会被应用。第二步就是选出需要被应用的日志然后开始rollforward。

  3、rollforward

  在做instance recovery时必须先定位到redo log 然后应用所有日志到datafile,这时候包括了committed和uncommitted的数据。当做完rollward,数据库就可以open了。

  4、rollback

  因 为rollforward产生了uncommitted数据,所以必须回滚这些数据。这将由smon和on-demand rollback来实现。smon将会扫描undo segment header去标志所有活动事务为dead,然后会逐渐去回滚这些事务。另外on-demand rollback提供了前台进程进行rollback,当前台进程企图获得被dead事务占用row lock,这时候前台进程将会去undo segment取得before image去回滚这个块,至于其他被这个dead事务lock的块就等待smon去回滚。

  另外,如果 在数据库打开的过程中process crash导致transaction dead,resource不能被释放的情况,这时候如果另一个进程需要这些resource,那么这个进程将会等待直到pmon清理dead process释放出resource。

  如果数据库Crash,重新启动,很久远以前的未提交事务并不在Redo的恢复序列中。

  但是未提交事务一定在回滚段事务表上存在,并且State=10,为活动事务。这就够了。

  数据库启动之后,这些事务会被SMON逐个标记为Dead(不可能再活过来了),然后由SMON慢慢去回滚这些事务;也存在另外一种情况,后来的进程会去读这些未提交数据,发现Dead事务未提交,则主动进行回滚。

  1、一个数据块发生更新,必然写回滚

  2、回滚段的block变化也记录在redo中

  一份未提交的数据必定在回滚中有相应的前镜像,任何正常的恢复都一定会把这些变化重新构建出来。

  想像一下

  1、update事务1更新了block 1

  2、回滚段1记录了block1的前镜像

  3、checkpoint

  4、update事务2更新了block2

  5、回滚段2记录了block2的前镜像

  6、instance crash

  现在重启数据库

  1、根据redo重新构建block2

  2、根据redo重新构建回滚段2

  3、database open

  4、SMON用回滚段2的数据回滚block2,SMON用回滚段1的数据回滚block1

  最后一步也可能是

  在另外一个select检索到block1或者block2的时候,发现这两个block的数据都是未提交的,此时再回滚block1和block2。

  所以,只要有相应的回滚数据存在,无论什么时候oracle都可以找到一致的数据,oracle只需要知道这个事务是提交了的还是没提交了的,而这点在block header ITL中有记录。

本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-11-05 20:28:39

oracle深度解析检查点的相关文章

深度解析javascript中的浅复制和深复制

     在谈javascript的浅复制和深复制之前,我们有必要在来讨论下js的数据类型.我们都知道有 Number,Boolean,String,Null,Undefined,Object五种类型.而Object又包含Function,Array 和Object自身.前面的五种类型叫做基本类型,而Object是引用类型.可能有人就要问,为什么要分基本类型和引用类型呢?后面你就会明白的.      我们首先来看看浅复制和深复制的简洁定义: 深复制:直接将数据复制给对应的变量 浅复制:将数据的地

深度解析如何做好页面SEO优化

页面seo优化在站内优化中占了很大一部分.那么如果做好页面优化呢?页面优化具体包括哪些细节部分优化呢?今天天津seo研究中心的tjseoer老师为大家做深度解析. 一.页面优化首先是标题title 标签 1.标题要紧扣文章中心内容,且标题的唯一独特性,目的可以让浏览者一看标题就知道内容是关于什么的,也是对搜索引擎的友好; 2.为标题加H1标签,同时标题出现的位置出现在<head>之后最好,为了搜索引擎最快找到标题. 3.标题字数控制在32字以内,多了在搜索结果里也无法显示.以及关键词出现的位置

深度解析Java 8:JDK1.8 AbstractQueuedSynchronizer的实现分析

前言 Java中的FutureTask作为可异步执行任务并可获取执行结果而被大家所熟知.通常可以使用future.get()来获取线程的执行结果,在线程执行结束之前,get方法会一直阻塞状态,直到call()返回,其优点是使用线程异步执行任务的情况下还可以获取到线程的执行结果,但是FutureTask的以上功能却是依靠通过一个叫AbstractQueuedSynchronizer的类来实现,至少在JDK 1.5.JDK1.6版本是这样的(从1.7开始FutureTask已经被其作者Doug Le

对Oracle软软解析的一点看法

杂谈  在接触过oracle优化器的特征之后,我们都知道oracle优化器的一个迷人之处,就在于shared pool的设计,说准确点是shared pool中的Library Cache,这种设计的结果就是让执行计划变得可缓存.因此产生了软解析的概念,这就保证了相同SQL在统计信息不发生变化的前提下只用经历一次繁杂的解析过程.而相对比软解析,oracle优化器还有一种更为特殊的行为,即软软解析,发生软软解析过程的SQL将消耗更小的开销,执行更加迅速. Cursor  首先了解下oracle中的

弹性计算峰会及神龙云服务器深度解析回顾

10月13日上午,云栖大会弹性计算全新企业线峰会主要内容有对弹性计算做了全面的精彩总结和产品细节分享,议程里发布了这个时代的新物种"神龙云服务器",当日在阿里云官网首屏神龙云服务器也同步发布上线,峰会现场研发总监张献涛对神龙云服务器做了深度解析,并在圆桌讨论环节为观众做了解答. 蒋林泉认为:"阿里云ECS是全世界最快的云主机." ECS超级稳定 背后的秘密是强健的IDC基础设施+飞天大规模智能运维能力:飞天自研领先核心虚拟化技术+业界最新的硬件架构,其中计算虚拟化核

CSS 继承深度解析

本文讲的是CSS 继承深度解析, 我酷爱模块化设计.长期以来我都热衷于将网站分离成组件,而不是页面,并且动态地将那些组件合并到界面上.这种做法灵活,高效并且易维护. 但是我不想我的设计看上去是由一些不相关的东西组成的.我是在创造一个界面,而不是一张超现实主义的照片. 很幸运的是,已经有一项叫做 CSS 的技术,就是特意设计用来解决这个问题的.使用 CSS,我就可以在 HTML 组件之间到处传递样式,从而以最小的代价来保证一致性的设计.这很大程度上要感谢两个 CSS 特性: 继承, 层叠 (CSS

shared pool 深度解析1+

原文整理自网络 1. 深入Shared Pool   Oracle数据库作为一个管理数据的产品,必须能够认出用户所提交的管理命令(通常叫做SQL语句),从而进行响应.认出的过程叫做解析SQL语句的过程,响应的过程叫做执行SQL语句的过程.解析是一个相当复杂的过程,它要考虑各种可能的异常情况,比如SQL语句涉及的对象不存在.提交的用户没有权限等.而且,还需要考虑如何执行SQL语句,采用什么方式去获取数据等.解析的最终结果是要产生Oracle自己内部的执行计划,从而指导SQL的执行过程.可以看到,解

Kafka深度解析

[本文转自于Kafka深度解析] 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐率.即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输 同时支持离线数据处理和实时数据处理 为什么要用消息系统 解耦 在项目启动之初来预测将来项目

陆金所计葵生: 深度解析大数据和AI对未来金融影响

近日,陆金所联席董事长兼CEO计葵生在北京大学数字金融研究中心"数字金融的中国时代"第二届年会上发表主题演讲,深度解析了大数据和AI对金融的影响.计葵生认为,大数据和AI理财能增加市场透明度,让机构更精准服务投资者,帮助客户分散投资风险,提高金融运行效率,支持实体经济发展. 计葵生认为,大数据和AI将对金融业产生巨大影响.如帮助机构从多维度去了解个人借款方的信用状况,快速作出判断."只需要几分钟甚至几秒钟来作出判断可否借钱给他,这会增多借款人的借款机会."人工智能和