Oracle包含常规检查点及增量检查点

常规检查点(Conventional Checkpoint)的触发条件与以下几个参数有关:

SQL> show parameters checkpoint
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
log_checkpoint_interval              integer                           0
log_checkpoint_timeout               integer                           1800
log_checkpoints_to_alert             boolean                           FALSE

同时执行以下语句时业触发常规检查点检查:

SQL> alter system switch logfile;

Oracle早期的版本仅进行常规检查点,从8i开始引入增量检查点(Incremental Checkpoint)的概念。在该版本中同时还引入了检查队列(Checkpoint Queue)的机制,后续检查CQ。在数据库内部,每一个脏数据块都会被移动到CQ中,按照Low RBA(第一次对该块修改对应的Redo Byte Address)的顺序进行排序,一个数据库进行多次修改,该数据块在队列上的顺序并不会发生改变。

 

当执行检查点是,DBWR从CQ中按Low RBA的顺序写出,实例检查点因此可以阶段性的不断增进。而CKPT进程使用非常轻量级的控制文件更新协议,将当前最低的RBA写入控制文件。

 

由于增量检查点可以连续的进行,因此检查点RBA比常规检查点更接近数据库的最后状态,从而可以极大的减少数据库实例恢复的时间。

另外,通过增量检查点,DBWR可以持续的进行写出,从而避免常规检查的发出的峰值写入对I/O的过度征用。

 

增量检查通过“Fast-Start Fault Recovery”特性来实现,可以通过视图v$option获取该特性的状态:

SQL> select * from v$option where parameter='Fast-Start Fault Recovery';
PARAMETER                               VALUE
--------------------------------------- --------------------
Fast-Start Fault Recovery               TRUE

该特性来源与Oracle企业版的Fast-Start Fault Recovery组件之中,该组件包含三个特性:

  1. Fast-Start Checkpoint

  2. Fast-Start On-Demand Rollback

  3. Fast-Start Parallel Rollback

Fast-Start Checkpoint特性在8i中通过fast_start_io_target参数实现,9i以后通过fast_start_mttr_target实现,该参数的取值范围0~3600s:

SQL> show parameter fast
NAME                                 TYPE                              VALUE
------------------------------------ --------------------------------- ------------------------------
fast_start_io_target                 integer                           0
fast_start_mttr_target               integer                           0
fast_start_parallel_rollback         string                            LOW

9i以后,Oracle推荐使用fast_start_mttr_target参数代替fast_start_io_target,log_checkpoint_timeout及log_checkpoint_interval参数。

同时,Oracle引入一个新的视图v$mttr_target_advice提供MTTR建议(该视图只有在fast_start_mttr_target被设置后才会进行统计):

select mttr_target_for_estimate mttrest,
       advice_status ad_st,
       dirty_limit dtl,
       estd_cache_writes estcw,
       estd_cache_write_factor estcrf,
       estd_total_writes esttw,
       estd_total_write_factor esttwf,
       estd_total_ios estti
  from v$mttr_target_advice;
   MTTREST AD_ST                  DTL      ESTCW     ESTCRF      ESTTW     ESTTWF      ESTTI
---------- --------------- ---------- ---------- ---------- ---------- ---------- ----------
        22 ON                   10212         92          1         92          1         92
        12 ON                    2075         92          1         92          1         92
        17 ON                    6478         92          1         92          1         92
        14 ON                    3998         92          1         92          1         92
        19 ON                    8131         92          1         92          1         92

该信息收集受statistic_level的控制,当该参数的值为TYPICAL或ALL时,MTTR建议被收集:

SQL> SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME LIKE 'statistic%';
NAME                 VALUE
-------------------- ---------------
statistics_level     TYPICAL
SQL> select statistics_name,
  2         session_status,
  3         system_status,
  4         description,
  5         activation_level,
  6         statistics_view_name
  7    from v$statistics_level
  8   where statistics_name = 'MTTR Advice';
STATISTICS_NAME SESSION_STATUS  SYSTEM_STATUS  DESCRIPTION                      ACTIVATION_LEVEL      STATISTICS_VIEW_NAME
--------------- --------------- -------------- -------------------------------- --------------------- ------------------------------
MTTR Advice     ENABLED         ENABLED        Predicts the impact of different TYPICAL               V$MTTR_TARGET_ADVICE
                                                MTTR settings on number of phys
                                               ical I/Os

官网关于MTTR配置的描述:http://docs.oracle.com/cd/E11882_01/server.112/e41573/instance_tune.htm#i1015453

 

数据库当前的实例恢复状态可以通过视图v$instance_recovery查询到:

select recovery_estimated_ios         reio,
       actual_redo_blks               arb,
       target_redo_blks               trb,
       log_file_size_redo_blks        lfsrb,
       log_chkpt_timeout_redo_blks    lctrb,
       log_chkpt_interval_redo_blks   lcirb,
       fast_start_io_target_redo_blks fsiotrb,
       target_mttr                    tmttr,
       estimated_mttr                 emttr,
       ckpt_block_writes              cbw
  from v$instance_recovery;
      REIO        ARB        TRB      LFSRB      LCTRB      LCIRB    FSIOTRB      TMTTR      EMTTR        CBW
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
        50        260       1174     165888       1174                                0          9     181638

视图中的EMTTR字段为数据库估计的平均恢复时间(MTTR),该值基于Dirty_Buffer数量和日志块数量得出。视图中TMTTR代表数据库期望的恢复时间,通常该值等于fast_start_mttr_target参数的设置值(如果fast_start_mttr_target定义的值极大或极小,TMTTR可能不等于该值)。

当 EMTTR接近或超过fast_start_mttr_target参数值时,系统触发检查点,将Dirty Buffer中的数据写出,系统恢复的信息将重新计算。

 

在数据库繁忙的情况下会出现EMTTR > TMTTR的情况,这可能是由于DBWR正忙于写出,甚至出现Checkpoint不能及时完成的情况。

参考《深入浅出Oracle》这本书的29页的例子

观察v$instance_recovery视图可以发现,CBW的增长与检查点已写出的数据块量,增量检查点的触发以及DBWR的持续写出有关。

Oracle 10G之后数据库实现自动调整检查点,数据库利用系统I/O低负载的时段写出内存中的脏数据。当fast_start_mttr_target参数未设置时,自动检查点调整生效。

 

修改该参数可以通过查看告警日志了解该参数设置的情况:

Wed Jan 07 12:06:06 2015

MTTR advisory was temporarily turned off because FAST_START_MTTR_TARGET was altered.

ALTER SYSTEM SET fast_start_mttr_target=180 SCOPE=BOTH;

Wed Jan 07 12:29:03 2015

MTTR advisory was turned off because FAST_START_MTTR_TARGET was disabled.

10G之后,在v$instance_recovery视图中WRITES_AUTOTUNE字段的值是指自动调整检查点执行的写出次数,CKPT_BLOCK_WRITES指的则是由检查点写出的BLOCKS。