oracle 完全检查点和增量检查点详解.docx

oracle 完全检查点和增量检查点详解.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
由于 Oracle 中 LGWR 和 DBWR 工作的不一致,Oracle 引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle 里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用: 1、完全检查点 在 Oracle8i 之前,数据库的发生的检查点都是完全检查点。完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,同时将最新的checkpoint scn 更新到所有的数据文件头部及控制文件。保证数据库的处于一致的状态。需要注意的是,完 全检查点产生的时候,CKPT 并不是把当前完全检查点发生那一时刻的 SCN 更新到控制文件和数据文件头,而是将这个触发检查点时刻DBWn 当前刚写完 dirty buffer 对应的SCN 更新到控制文件和数据文件头, 也就是说,更新控制文件和数据文件头的 SCN 是滞后于完全检查点的发生那一时刻的 SCN 的,这个从恢复的原理也很容易理解,因为检查点发生的时候要写入dirty buffer 还没有写入,自然不能立即更新成当前的 SCN 了。需 要注意的是, 在 oracle8 之前,由于没有 chekpoint queue,也没有增量检查点的概念,发生完全检查点时,DBWn 会以一种无序的方式将所有的 dirty buffer 写出到数据文件,这个时候 Oracle 会冻结所有 DML 操作等候所有 dirty buffer 被写出, 巨大的 IO 往往会影响到数据库的性 能。后来随着 Oracle 数据库的发展和buffer cache 的不断增大,oracle 意识到这个单一的 Full checkpoint 机制已经不能满足需要,所以在 Oracle 8i 后提出增量检查点的概念,建立了checkpoint queue ,让 dirty buffer header 根据首次变化时候的顺序(LRBA) 排列在 queue 里面。 这样 DBWn 只要顺着 queue 的顺序写,而其他进程不必等候dbwr 的写完成就可以继续。 因此增量检查点的概念就由此产生了。 完全检查点在 8i 之后只有在下列两种情况下才会发生: DBA 手工执行 alter system checkpoint 的命令; 数据库正常 shutdown (immediate,transcational,normal)。 2、增量检查点说白了,就是 CKPT 每 3 秒一次的检查 DBWn 写进度并在控制文件中记录检查点位置(checkpoint position)和更新 heartbeat 信息 以及 CKPT 定期触发 DBWn 去写 checkpoint queue 中的脏数据 这两项操作合一起被称为增量检查点。 --可能这块描述的过于笼统,大家继续往下看:-) 我 们都知道被修改过的数据块,在 oracle 中都被统称为脏数据块(dirty buffer)。所有的脏块被一个链表串起来,称做检查点队列(checkpoint queue)。在 buffer cache 中,每一个块都有一个 buffer header 简称 BH, 在 BH 中有一个ckptq 项, 此项目中记录了指向检查点队列上一个块和下一个块的指针。 如果某一个块不在检查点队列中,他的 ckptq 项为空.通过 ckptq 项 oracle 将所有的脏块串成了一个双向链表。这个双向链表就是检查点队列了。 Oracle 从 8i 开始引入了检查点队列(checkpoint queue)的概念,用于记录数据库里面当前所有的 dirty buffer 的信息,这些 dirty buffer 的信息按被修改的时间先后存放在 checkpoint queue 里面(当块首次被更改时,块会立即被加进检查点队列),所涉及的条目主要包含 RBA (Redo Block Address,重做日志里面用于标识事务期间数据块在重做日志里面发生更改的编号)和数据块的数据文件号和块号。 不论数据块 (buffer)更改几次,它在 checkpoint queue 里面的位置始终保持不变,checkpoint queue 也只会记录它最早的 RBA(这个最早的 RBA 其实就是 Low RBA,也就是数据块第一次被修改时所对应的RBA),从而保证最早更改的数据块能够尽快从内存写入数据文件。DBWR 每到一定的时机,就会被触发 (DBWn 并不是只有当检查点发生的时候才写,它大约有 10 几种条件触发写操作),沿着检查 点队列的顺序刷新脏块,同时 CKPT 进程,会监控着检查点队列 的长度,当检查点队列的长度达到一定限制时(具体有几个参数来确定checkpoing queue 的长度, 下面会提到比如 log_che

文档评论(0)

mph + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体上海谭台科技有限公司
IP属地湖北
统一社会信用代码/组织机构代码
91310115MA7CY11Y3K

1亿VIP精品文档

相关文档