checkpoint知识与SCN的关系

1、什么是checkpoint?

     checkpoint官方文档的定义“A data structure that defines an SCN in the redo thread of a database. Checkpoints are recorded in the control file and each datafile header, and are a crucial element of recovery.”

     就是定义redolog中scn的一种数据结构,记录在控制文件和每个数据文件的头部(指的的SCN),是数据库恢复过程中非常重要的元素。

     checkpoint就是checkpoint发生时那一瞬间对整个时间状态的快照描述。

2、检查点的作用

Purpose of Checkpoints

Oracle Database uses checkpoints to achieve the following goals:

  • Reduce the time required for recovery in case of an instance or media failure

  • Ensure that dirty buffers in the buffer cache are written to disk regularly

  • Ensure that all committed data is written to disk during a consistent shutdown


    大多数关系型数据库都采用"在提交时并不强迫针对数据块的修改完成"而是"提交时保证修改记录(以重做日志的形式)写入日志文件"的机制,来获得性能的优势

这句话的另外一种描述是:

      当用户提交事务,写数据文件是"异步"的,写日志文件是"同步"的。

      这就可能导致数据库实例崩溃时,内存中的 DB_Buffer  中的修改过的数据,可能没有写入到数据块中。数据库在重新打开时,需要进行恢复,来恢复 DB Buffer  中的数据状态,并确保已经提交的数据被写入到数据块中。 检查点是这个过程中的重要机制,通过它来确定,恢复时哪些重做日志应该被扫描并应用于恢复。  

3、背景知识

      1、概念

      dirty block(脏块):databuffer中改动过的块(insert、delete、update)

      checkpoint_quene:在databuffer中每个块中都有一个buffer header简称BH, 在BH中有一个ckptq项, 此项目中记录了指向检查点队列上一个块和下一个块的指针,如果某一个块不在检查点队列中,他的ckptq项为空.通过ckptq项oracle将所有的脏块按照low_cache_rba(第一次被脏的顺序)串成了一个双向链表。这个双向链表就是检查点队列了。就是所有的脏块被一个链表串起来,这个链表又叫LRUW。

       RBA(redo block adress):databuffer中每个block被修改后,都会成生成redolog,事务被commited后,会通过lgwr写入redolog中,RBA就是这个块对应的物理地址。

       low_cache_rba:databuffer中块第一次被脏的时候对应的RBA

       on_disk_rba:redolog中最后一条日志的block adress

3、检查点的分类(详解)

    1、增量检查点

    增量检查点主要做以下两件事:

    (1)CKPT进程,会监控着检查点队列的长度,当检查点队列的长度达到一定限制时,CKPT会通知DBWR写脏块.CKPT会根据参数的设置和I/O的速度以及繁忙程度,计算出来一个Target rba(目标rba),DBWR会沿着检查点队列,将所有Target rba之前的脏块刷新到磁盘.当CKPT通知完DBWR Target rba后,CKPT的任务就结束了.他并不会等待DBWR写完所有的Target rba之前的脏块.通知DBWR写脏块,这是CKPT的任务之一。

     (2)CKPT另有一个任务,就是每3秒,检测一次DBWR的写进度.检查点队列最前面的块被称为检查点位置.DBWR是沿着检查点队列写脏块的,CKPT每3秒钟查看一下DBWR沿检查点队列写到了哪里,并且将这个位置设置为检查点位置.也就是说检查点位置之前的块,都是已被DBWR刷新到磁盘上的块.这个3秒一次检查DBWR进度的工作,也是CKPT的一个重要的任务。

     CKPT每3秒一次的工作和CKPT定期触发DBWR,这两项操作合一起被称为--增量检查点。

     oracle11g中concepts中写道:

    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.

     就是增量检查点不会更新controlfile、datafile的头部中SCN,只会更新controlfile中low_cahce_rba的地址,就是下次dbwr写checkpoint quene的起点。

     2、完全检查点

      触发dbwr将checkpoint quene中的dirty block写入disk,然后将这批块的最后一个SCN写入control file、datafile的header(另外当一个redolog从active变成inactive就是归档之后也会更新这些文件中的SCN)。

     触发条件(8i以后)

    1、DBA手工执行alter system checkpoint的命令;
    2、数据库正常shutdown (immediate,transcational,normal)。

    检查点位置发生变更后, 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建议不再使用。


文章部分内容引用:http://blog.csdn.net/l106439814/article/details/7801800

                                    http://blog.csdn.net/tianlesoftware/article/details/5251916

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值