- 浏览: 518967 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
u011165335:
distinct不影响使用半连接
(转)关于semi-join/anti-join的一点探讨 -
353790060:
redo 记录事务执行后的日志 undo 记录事务回滚的日志 ...
Oracle redo与undo浅析 -
jayxigua:
redo用于在失败时重放事务(即恢复事务),undo则用于取消 ...
Oracle redo与undo浅析 -
aa_qq110:
Openbravo有中文包吗
Openbravo开发手册 -
iocaop:
不错,写的很清晰易懂
JAVA 服务提供者框架介绍
原文地址: http://hi.baidu.com/zty598416146/blog/item/3ab92b4f180f111fb2de0539.html
由于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_checkpoint_timeout,fast_start_mttr_target等),CKPT会通知 DBWR写脏块。CKPT会根据几个参数的设置和I/O的速度以及繁忙程度,计算出来一个Target rba(目标rba),DBWn会沿着检查点队列,按照dirty buffer的Low RBA顺序将所有Target rba之前对应的脏块从内存写入数据磁盘文件。当CKPT通知完DBWn Target rba后,CKPT的任务就结束了。他并不会等待DBWn写完所有的Target rba之前的脏块。因此这里CKPT只是起到了一个通知DBWn进程写入的作用。
当完全检查点发 生的时候,Oracle一方面通知DBWn进行下一批写操作,另一方面是将这个触发检查点时刻DBWn当前刚写完dirty buffer对应的SCN写入数据文件头和控制文件,这个SCN就是checkpoint scn。但Oracle考虑到检查点SCN的间隔还是太大了,因为检查点的触发条件有限,周期可能比较长,有些情况下比如检查点需要5分钟左右才触发,那 这个时候系统crash再重新启动就意味着很可能系统需要5分钟左右才能启动。于是Oracle采用了一个heartbeat的概念,以3秒的频率将 DBWn写的进度反应到控制文件中,这样系统crash重新启动的时候将从更近的一个时间点开始恢复。Oracle这么做的目的就是要缩短崩溃恢复时间! 因此CKPT另外一个任务就是每3秒,检测一次DBWn的写进度。DBWn 是沿着检查点队列写脏块,由于这里有一个顺序的关系,所以DBWn的写的进度就是可衡量的,写到哪个buffer的时候该buffer的首次变化时候的 scn(对应了LRba)就是当前所有数据文件block的上面最新scn,但是由于无法适时的将DBWn的进度记录下来,所以Oracle选择了一些策 略。 其中就包括CKPT进程的检查点位置更新和心跳,所以说CKPT每3秒钟查看一下DBWn沿检查点队列写到了哪里,并且将这个位置设置为检查点位置 (checkpont position)。也就是说检查点位置之前的块,都是已被DBWn刷新到磁盘上的块。因此我们可以理解为,CKPT进程每3秒会根据DBWn写的进度设置并记录一个检查点位置,也就是说这个检查点位置就是由DBWn的在往Target RBA写过程中的进度决定的(如果没有dirty buffer产生,那么就不会更新检查点位置信息)。因 此CKPT每3秒会将检查点位置对应的数据块的rba (low cache rba-表示Instance Recovery时开始恢复的日志条目)更新和记录到控制文件的CHECKPOINT PROGRESS RECORDS区域,当然同时被记录进控制文件的还有heartbeat等其他信息。DBWn将检查点队列里面的dirty buffer写入到数据文件后,检查点的位置也要相应地往后移。
检 查点位置(checkpoint position)实际上就可以直接理解为是一个rba,他指向着重做日志文件中的某条重做记录。在此检查点位置前的重做记录,其对应的buffer cache中的dirty buffer已经被写进了数据文件,在此位置后的重做记录,所对应数据脏块有可能还在内存中。如果发生了实例崩溃,只需要在日志文件中找到检查点位置 (low cache rba),从此处开始应用所有的重做日志文件,就完成了前滚操作。实例崩溃后,再次启动数据库,oracle会到控制文件中读取low cache rba,这就是检查点位置。从此处开始应用重做日志,应用到on disk rba的位置。on disk rba是磁盘中重做日志文件的最后一条重做记录的rba。如 果某条重做记录的rba高于on disk rba,那说明此重做记录还没有被写进日志文件中,崩溃发生时,他是不可能被恢复的。on disk rba是oracle前滚操作的终点。比这个更高的rba,都应该还驻留在log buffer中。还没有被LGWR写入日志文件。所以是不能被用于恢复的。
在DBWn写dirty buffer这个检查点过程中,Oracle也可以继续产生dirty buffer,DBWn也不是一次要把所有dirty buffer全部写到磁盘(不同于完全检查点的地方),这样就提高了检查点的效率,使得数据库要做恢复的时候从这个最新位置开始做恢复,而不是从数据文件 中的checkpoint scn(上一个完全检查点位置) 开始做恢复,这样将缩短恢复时间。
Oracle 11g的 Concept里面提到:An incremental checkpoint is a type of thread checkpoint partly intended to avoid writing large numbers of blocks at online redo log switches. DBWn checks at least every three seconds to determine whether it has work to do. When DBWn writes dirty buffers, it advances the checkpoint position, causing CKPT to write the checkpoint position to the control file, but not to the data file headers.
因此我们需要注意的是:增量检查点并不会去更新数据文件头,以及控制文件中数据库SCN以及数据文件条目的SCN信息,而只是每3秒由CKPT进程去更新控制文件中的low cache rba信息,也就是检查点的位置。
检查点位置发生变更后, Oracle主要通过4个参数和1个机制来控制检查点位置和最后的重做日志条目之间的距离(检查点队列的长度)。
fast_start_io_target (Oracle 9i以后已经废弃)
该 参数用于表示数据库发生Instance Recovery的时候需要产生的IO总数,它通过v$filestat的AVGIOTIM来估算的。比如我们一个数据库在发生Instance Crash后需要在10分钟内恢复完毕,假定OS的IO每秒为500个,那么这个数据库发生Instance Recovery的时候大概将产生500*10*60=30,000次IO,也就是我们将可以把fast_start_io_target设置为 30000。
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废除了。
log_checkpoint_timeout
该参数用于表示检查点位置和重做日志文件末尾之间的时间间隔,以秒为单位,默认情况下是1800秒。相 比fast_start_mttr_target,它也是时间,但它的时间值表示完成恢复操作所需要的时间,即从最后的检查点位置开始,应用所有日志直到 日志末尾所需要的时间。而本参数log_checkpoint_timeout表示从最后的检查点位置开始,到日志末尾经过的时间。
log_checkpoint_interval
该参数是表示检查点位置和重做日志末尾的重做日志块的数量,以OS块表示。
90% OF SMALLEST REDO LOG
除了以上4个初始化参数外,Oracle内部事实上还将重做日志文件末尾前面90%的位置设为检查点位置。在每个重做日志中,这么几个参数指定的位置可能不尽相同,Oracle将离日志文件末尾最近的那个位置确认为检查点位置。
在Oracle 9i后,对检查点频率,建议只设置fast_start_mttr_target。根据需要,也可以通过设置 log_checkpoint_timeout,设置一个脏块保持脏状态的最大时间,而其他两个参数 fast_start_io_target,log_checkpoint_interval建议不再使用。
发表评论
-
Oracle事务原理探究2--读书笔记五
2015-01-05 13:46 1703续上篇... 3. 数据块访问与undo ... -
Oracle事务原理探究1--oracle核心技术读书笔记五
2014-12-29 21:18 20281. 冲突解决 假如有一个系统只有你和我两个 ... -
oracle undo 复杂度--oracle核心技术读书笔记四
2014-10-01 14:23 1288一. 概述 undo ... -
Oracle redo 复杂度--oracle核心技术读书笔记三
2014-09-29 22:13 1190一. 概述 我 ... -
(转)undo系列学习之Oracle IMU及Redo Private Strands技术
2014-09-27 23:09 1169原博客地址: http://blo ... -
oracle如何保证事务的ACID原则--oracle核心技术读书笔记二
2014-09-21 11:18 1785在事务中有四个通用的原则是所有数据库都必须遵守的,简称ACI ... -
Oracle基本数据改变原理浅析(redo与undo)--oracle核心技术读书笔记一
2014-09-14 17:00 4845在oracle中我们做一些更新操作,oracle底层是怎么流 ... -
(转)Oracle中Hint深入理解
2014-01-07 19:48 1217原文出处:http://czmmiao.iteye.com/ ... -
Oracle全表扫描成本示例
2013-12-29 22:51 0一. 准备工作 1. block size 8KB( ... -
(转)Oracle查看trace文件步骤
2013-12-10 09:54 5447原文地址: http://www.2cto.com/data ... -
【转】CBO hint:no_unnest,push_subq,push_pred的用法
2013-12-02 20:11 1266原博客地址:http://blog.itpub.net/15 ... -
index_stats视图各列的含义
2013-12-02 19:10 1403index_stats视图来收集B树 ... -
(转)Oracle 调整SGA、PGA大小
2013-10-31 13:25 31219SQL> show parameter sga; ... -
(转)Oracle cursor_sharing 参数 详解
2013-08-25 23:04 1991原博客地址:http://blog.csdn.net/tia ... -
(转)shared pool 原理
2013-08-18 22:58 1490原博客地址:http://blog.csdn.net/ro ... -
(转)Oracle 游标(cursor)说明
2013-08-15 20:17 1493原博客地址:http://blog.csdn.net/ti ... -
(转)关于semi-join/anti-join的一点探讨
2013-08-14 21:20 11010原博客地址:http://space.itpub.net ... -
oracle 索引访问方式
2013-07-29 23:02 1467一. 概述 index uni ... -
(转)Oracle动态性能视图学习笔记(2)_v$sesstat_v$mystat_v$statname
2013-07-29 21:41 1215原博客地址:http://space.itpub.net/1 ... -
(转)Oracle性能优化 之 共享池
2013-07-29 21:04 1268转载作品,原始出去如下: http://blog.ch ...
相关推荐
Checkpoint 分为完全检查点(Normal checkpoint)和增量检查点(Incremental checkpoint)两种。完全检查点是指将所有脏块写入到硬盘,增量检查点是指将部分脏块写入到硬盘。 在了解 Checkpoint 工作原理之前,需要...
### Oracle 增量恢复详解 #### 一、Oracle RMAN 增量备份概述 在Oracle数据库管理系统中,RMAN(Recovery Manager)是一种强大的工具,用于执行数据库的备份与恢复操作。其中,增量备份作为一种高效的方式,在实际...
### Oracle数据库全备份和增量备份知识点详解 #### 一、Oracle数据库备份概述 在Oracle数据库管理中,备份是一项至关重要的任务,它确保了在发生硬件故障、软件错误或人为失误时能够快速恢复数据。根据备份策略的...
它提供了全面的数据保护方案,包括备份、恢复、检查点管理、数据库克隆以及介质故障的处理。以下是对Oracle RMAN的详细解释: 一、RMAN的基本概念 1. **RMAN接口**:RMAN可以通过SQL*Plus或者操作系统命令行来访问...
### Oracle备份恢复知识点详解 #### 一、Oracle数据库备份与恢复概述 Oracle数据库备份与恢复是确保数据安全的重要环节。当遇到系统故障或人为错误时,一个有效的备份策略能够最大限度地减少数据丢失的风险。本...
- 通过增量检查点分散脏缓冲区的刷新操作,降低了 I/O 负载。 **2. 加速故障恢复:** - 控制文件中的检查点信息可以帮助 Oracle 快速定位到需要恢复的 Redo 日志段。 - 有效缩短了数据库重启后的实例恢复时间。 #...
### Oracle 10g完全参考知识点详解 #### 一、Oracle 10g概述 - **版本背景**:Oracle Database 10g是Oracle公司于2004年推出的一款数据库管理系统,它标志着Oracle数据库发展的一个重要里程碑。10g中的“g”代表...
### Oracle数据库备份与恢复知识点详解 #### 一、备份与恢复基础 在Oracle数据库的运维过程中,备份与恢复是至关重要的环节,它们确保了数据的安全性和业务的连续性。备份通常指的是将数据库中的数据和控制信息...
8. **数据库监控**:学习使用Enterprise Manager Cloud Control进行系统监控,包括性能监控、警报设置和健康检查。 9. **数据库设计与物理结构**:理解Oracle的表类型,如分区表、索引组织表,以及如何根据业务需求...
根据提供的文件信息,本文将详细解释Oracle RMAN(Recovery Manager)的相关知识点,包括检查数据库模式、连接到目标数据库、查看备份状态以及常用的备份命令等内容。 ### 一、检查数据库模式 #### 1.1 检查是否...
### Oracle DataGuard 主库丢失归档日志后备用库的 RMAN 增量恢复案例详解 #### 一、问题背景及场景描述 在Oracle DataGuard的架构中,当主库(Primary Database)与备用库(Standby Database)之间进行数据同步时...
### ODI工具CDC增量数据抽取知识点 #### 一、ODI与CDC概念解析 - **ODI (Oracle Data Integrator)**:是一种企业级的数据集成工具,由Oracle公司提供,主要用于ETL(Extract, Transform, Load)操作,即数据的提取、...
### Oracle10G数据备份知识点详解 #### 一、数据库备份的重要性 数据库备份是确保数据安全性和业务连续性的关键步骤。对于Oracle 10g这样的企业级数据库管理系统来说,有效的备份策略不仅能帮助组织应对意外故障,...
### NBU 7.6 配置Oracle知识点详解 #### 一、NetBackup与Oracle集成概述 NetBackup(简称NBU)是由Veritas公司开发的一款数据保护和灾难恢复解决方案,广泛应用于企业级环境中进行数据备份与恢复。Oracle数据库...
### Oracle 11g 使用教程知识点详解 #### 一、Oracle 11g 概述 Oracle 11g 是 Oracle 公司推出的第 11 版本的数据库管理系统,它在 Oracle 10g 的基础上进行了多方面的改进与增强,提供了更强大的功能和更高的性能...
### Oracle 数据库2天 DBA 知识点详解 #### 关于这本指南 - **目标读者:** 这本指南面向的是希望快速掌握Oracle 11g数据库管理基础的初级DBA人员。 - **主要内容:** 包括Oracle数据库的基础概念、安装流程、数据库...
RMAN是Oracle数据库恢复管理器,用于执行物理备份和恢复操作,支持增量备份、数据块级检查、加密和压缩等功能。通过RMAN,可以创建数据库的完整备份、增量备份,以及归档日志的备份。在恢复阶段,RMAN可以根据需要...
总结来说,Oracle的检查点机制是其高可用性和数据完整性的基石。通过对数据库状态的定期记录和更新,即使在系统故障后,也能迅速恢复服务,保障了业务连续性。理解并优化检查点的运行对于提高数据库性能和稳定性至关...
### Oracle 10g RAC 知识点详解 #### 一、Oracle 10g RAC 概念与原理 **Oracle Real Application Clusters (RAC) 是一种多实例集群技术,允许多个数据库实例同时访问同一个数据库。** 这种架构能够显著提高系统的...