ITPub博客

首页 > 数据库 > Oracle > 全局检查点和增量检查点(zt)

全局检查点和增量检查点(zt)

原创 Oracle 作者:tolywang 时间:2008-01-12 09:52:49 0 删除 编辑
由于Oracle中LGWR和DBWR工作的不一致,Oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在Oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用: [@more@]


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的时候大概将产生500*10*60=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将离日志文件末尾最近的那个位置确认为检查点位置。

=============================================

1. oracle 7 中只有全局检查点,因为没有checkpoint queue,dirty buffer是无序的,所以必须一次性写出,写出的过程中要lock dirty buffer不能再被修改。

oracle 8 中全局检查点变成了增量检查点,它是和checkpoint queue一起出现的。增量检查点发生的时候,ckpt检查点进程将已经完成的最后一个检查点写到数据文件头和控制文件,通知dbwr开始写数据文件写到检查点触发这个时刻(也就是当前时刻)。在checkpoint queue中,dirty buffer按照低重做值(第一次变脏的顺序)排序,所以在写出的时候dirty buffer可以同时被修改。这是增量检查点最重要的作用。

有一个叫heartbeat的概念,也就是ckpt检查点进程每3秒将当前dbwr写的进度(rba)写到控制文件中。于是这个就缩短了instance recovery和media recovery的过程(当然这个过程也不是越短越好,否则dbwr写太频繁会带来I/O方面的问题)。这是增量检查点的另一个好处。


2. 这几个参数就是通过oracle的算法,决定了下一次增量检查点发生的时间或者说位置。


3. 9i开始推荐使用fast_start_mttr_target,另外的参数都置0。

Whenever you set FAST_START_MTTR_TARGET to a nonzero value, and while MTTR advisory is ON, Oracle Corporation recommends that you disable (set to 0) the following parameters:

  • LOG_CHECKPOINT_TIMEOUT
  • LOG_CHECKPOINT_INTERVAL
  • FAST_START_IO_TARGET

Because these initialization parameters either override FAST_START_MTTR_TARGET or potentially drive checkpoints more aggressively than FAST_START_MTTR_TARGET does, they can interfere with the simulation.

这里“MTTR advisory is ON”的条件是,STATISTICS_LEVEL is set to TYPICAL or ALL,以及the initialization parameter FAST_START_MTTR_TARGET is set to a nonzero value。

http://roujiaweize.spaces.live.com/blog/cns!9745F14B4AEB3B72!941.entry

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-997143/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle , MySQL, SAP IQ, SAP HANA, PostgreSQL, Tableau 技术讨论,希望在这里一起分享知识,讨论技术,畅谈人生 。

注册时间:2007-12-10

  • 博文量
    5595
  • 访问量
    13884852