全量CHECKPOINT和增量CHECKPOINT对用户都是透明的,而增量CHECKPOINT只不过是将全量CHECKPOINT要写的脏块分时间分批次写到数据文件中而已,此操作可以极大地减少对数据库性能的影响。
- 全量CHECKPOINT
全量CHECKPOINT是指DBWR进程将脏缓冲区列表中的脏块一次性地写入数据文件中。该操作可以简单地分为2个步骤(这里假设执行全量CHECKPOINT的时间点为t1):
(1)DBWR进程将t1时间点前的所有脏块写到数据文件。如果脏块很多,将引起大量的I/O写操作。如果DBWR进程数不够,写入速度将比较缓慢。
(2)确定所有脏块都写进数据文件之后,CKPT进程更新控制文件和数据文件头。
假如SGA中的脏块数量很多,那么DBWR进程一次性写脏块是非常消耗I/O的,这不仅加重了DBWR进程的负担,而且还可能因为I/O问题而影响业务,所以不建议频繁进行全量CHECKPOINT操作。 - 增量CHECKPOINT
从Oracle 8开始,Oracle推出了增量CHECKPOINT这一特性,即DBWR进程将CKPTQ队列中的脏块不断地写往磁盘中,从而减轻磁盘I/O压力。Oracle是否启用增量CHECKPOINT,跟隐含参数_disable_incremental_checkpoints有关(默认开启增量CHECKPOINT)。增量CHECKPOINT操作步骤可以简单地分为3步:
(1)BUFFER CACHE中脏块第一次被更新的时候产生的重做日志记录在重做日志文件中所对应的位置就称为LRBA(Low Redo Block Adress)。脏块按照LRBA顺序组成CKPTQ列表。DBWR进程扫描CKPTQ列表,依次将满足条件的脏块写进数据文件中,并在内存中递增CHECKPOINT NUMBER值,即SCN值。
(2)脏块写成功之后,DBWR进程将脏块从CKPTQ队列中移走。
(3)CKPT进程每隔3秒在控制文件中更新DBWR写脏块的进度,即增量CHECKPOINT所完成的RBA信息。 - 全量CHECKPOINT和增量CHECKPOINT区别
增量CHECKPOINT时,CKPT进程不更新数据文件头信息,但会更新控制文中的CHECKPOINT PROGRESS RECORDS。可以DUMP控制文件观察当前实例LGWR进程写在线日志的进度情况。全量CHECKPOINT和增量CHECKPOINT的主要区别如下:
写脏块的动作不同。全量CHECKPOINT会将BUFFER CACHE中某一时间点之前的所有脏块刷新到数据文件中,在脏块比较多的数据库中,全量CHECKPOINT操作可能会影响数据库的性能。增量CHECKPOINT则是将脏块第一次变脏的顺序分为不同的时间点逐批写到数据文件中,有点“细水长流”的感觉。
更新的位置不同。全量CHECKPOINT完成之后,会更新内存、数据文件头、控制文件。而增量CHECKPOINT完成之后,只更新内存SCN值和控制文件。
触发的条件不同。全量CHECKPOINT往往需要通过命令人为触发,而增量CHECKPOINT的触发受多种因素影响,如ONLINE REDOLOG大小、参数FAST_START_MTTR_TARGET等。