zoukankan      html  css  js  c++  java
  • 影响Incremental checkpoint position的条件

    一:fast_start_io_target,这个参数在9i中被废了,所以不讨论了,而且在10gR2的官方文档中也找不到此参数的任何信息,不过可以show parameter看到此参数。

    二:log_checkpoint_timeout,该参数默认值为1800 seconds,也就是说每个半小时会执行一次incremental checkpoint,注意观察alert log的告警信息(想要在alert log中看到此信息,需要设置log_checkpoints_to_alert=TRUE),每个半小时就会执行一次Incremental checkpoint。

    Mon Dec 28 13:11:32 2009
    Incremental checkpoint up to RBA [0x4e.1b8c.0], current log tail at RBA [0x4e.1c82.0]
    Mon Dec 28 13:41:38 2009
    Incremental checkpoint up to RBA [0x4e.20c8.0], current log tail at RBA [0x4e.21c4.0]
    Mon Dec 28 14:11:45 2009
    Incremental checkpoint up to RBA [0x4e.2b39.0], current log tail at RBA [0x4e.2bdf.0]
    Mon Dec 28 14:41:51 2009
    Incremental checkpoint up to RBA [0x4e.2fe8.0], current log tail at RBA [0x4e.30a0.0]

    SQL> show parameter log_checkpoint_timeout;

    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ---------------
    log_checkpoint_timeout               integer     1800

    三:fast_start_mttr_target,该参数在10gR2中默认为0,也就是说让ORACLE进行自动检查点调整,如果要严格控制在一定时间内恢复数据库,那么就可以设置fast_start_mttr_target。如果设置了参数log_checkpoint_interval,那么fast_start_mttr_target会被log_checkpoint_interval覆盖。

    四:log file switch,会触发一个增量检查点,不过它会更新datafile header

    SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;

         DIRTY ON_DISK_SCN      ON_DISK_TIME              CPHBT
    ---------- ---------------- -------------------- ----------
            51 1964144          12/28/2009 15:41:41   706772766

    SQL> alter system switch logfile;            

    System altered

    SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;

         DIRTY ON_DISK_SCN      ON_DISK_TIME              CPHBT
    ---------- ---------------- -------------------- ----------
            51 1964151         12/28/2009 15:41:53 706772770 ---logfile switch 不是full checkpoint,因为还存在dirty block

    可以看到switch logfile之后,依然有51个dirty的block在buffer cache中,说明没有执行full checkpoint,因为执行full check point之后buffer cache中是不会有dirty 的block的,下面执行一个FULL checkpoint;

    SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;

         DIRTY ON_DISK_SCN      ON_DISK_TIME              CPHBT
    ---------- ---------------- -------------------- ----------
            43 1964223          12/28/2009 15:44:29   706772822

    SQL> alter system checkpoint;

    System altered

    SQL> select cpdrt dirty,cpods on_disk_scn,cpodt on_disk_time,cphbt from x$kcccp where indx=0;

         DIRTY ON_DISK_SCN      ON_DISK_TIME              CPHBT
    ---------- ---------------- -------------------- ----------
             0 1964229          12/28/2009 15:44:44   706772826    ---可以看到full checkpoint之后dirty block为0了

    五:log_checkpoint_interval,该参数在10gR2中默认为0,该参数表示最后一次增量检查点以来,累积的日志块数(注意,这里的日志块数表示操作系统的块,非oracle的块,此块大小可以通过x$kccle.lebsz查到),如果达到了设定值,那么将触发增量检查点,该参数会覆盖fast_start_mttr_target 请看测试:

    SQL> select max(lebsz) from x$kccle;

    MAX(LEBSZ)
    ----------
           512                 

    日志块为512byte,那么设置log_checkpoint_interval=2048,也就是说产生了1M的redo 就会触发一个增量检查点,下面来验证下,首先我切换一下日志文件

    SQL> alter system switch logfile;

    System altered

    SQL> alter system set log_checkpoint_interval=2048;

    System altered

    SQL> create table test as select * from dba_objects;

    表已创建。

    由于创建表test会产生多余1M的日志,所以,会引发一个增量检查点,我们查看alert 日志

    ALTER SYSTEM SET log_checkpoint_interval=2048 SCOPE=BOTH;
    Mon Dec 28 16:04:51 2009
    Completed checkpoint up to RBA [0x51.2.10], SCN: 1965065   ----此处果然引发了一个增量检查点

    六:ORACLE内部有这样一个限制:当生成的重做日志达到了阀值 0.9*(sum(v$log.bytes)-max(v$log.bytes)),就会引发一个增量检查点,通常情况下这个限制难以达到,因为生产库上会有多个日志组,在达到这个阀值之前就会产生logfile switch。

    要通过实验手段看到这个限制条件,可以把日志组设置为2,然后再进行实验。

    为了进行实验,我将logfile group 1设置为20M,将group 2 设置为200M;

    SQL> select * from v$log;

        GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARCHIVED STATUS           FIRST_CHANGE# FIRST_TIME
    ---------- ---------- ---------- ---------- ---------- -------- ---------------- ------------- -----------
             1          1         91   20971520          2 YES      INACTIVE               2011443 12/28/2009
             2          1         92  209715200          2 NO       CURRENT                2011445 12/28/2009

    然后将200m的日志文件设置为current ,然后再进行一个大事物,然后运行如下SQL

    SQL> select le.leseq    current_sequence,round(100*cp.cpodr_bno/le.lesiz,2)||'%' percentage,le.lesiz*512/1024/1024||'Mb' log_file_size,
      2  round((le.lesiz*512/1024/1024)*(cp.cpodr_bno/le.lesiz),2)||'Mb' used_size
      3  from x$kcccp cp,x$kccle le where le.leseq =cp.cpodr_seq and le.lesiz>0;

    CURRENT_SEQUENCE PERCENTAGE                                LOG_FILE_SIZE        USED_SIZE
    ---------------- ----------------------------------------- -------------------- ------------------------------------------
                  92 23.12%                                    200Mb                46.23Mb
    查看当前log 的使用率,到了一定阀之后就会出现增量检查点,我这里的logfile 已经使用了46.23M才产生增量检查点,按理说应该是达到18M就会产生的,可能是机器还没反应过来吧,总之产生了增量检查点,这个与上面的理论相符合。

    Mon Dec 28 17:52:24 2009
    Incremental checkpoint up to RBA [0x5c.119fd.0], current log tail at RBA [0x5c.17167.0]

  • 相关阅读:
    同时实现同时只允许一个人登录系统 dodo
    比较C#中的readonly与const (转) dodo
    iframe,Frame中关于Session丢失的解决方法 dodo
    sqlserver数据库同步解决方案 dodo
    利用C#调用WINRAR实现压缩与解压 dodo
    .net打包自动安装数据库 dodo
    关于sqlserver packet size dodo
    真正生成高质量不变形缩略图片 dodo
    Datagrid列表控件使用 dodo
    NUnit学习之VS.net 2005篇(转) dodo
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330626.html
Copyright © 2011-2022 走看看