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组件之中,该组件包含三个特性:
Fast-Start Checkpoint
Fast-Start On-Demand Rollback
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。