这篇文章,源于群中几位网友的疑问,故打算写这篇文章给其释疑。
1. 何为检查点?其存在的意义?
2. 检查点的有哪些分类?检查点的结构如何?什么是checkpoint queue?
通俗的将,检查点仅仅是一个机制而已,其作用是通知DBWR进程将cache buffer中的脏块写入
到disk中,当然这个通知的动作是通过检查点进程CKPT来完成的。那么检查点存在的意义是什
么呢?其实很简单,目的就是减少db crash后的recover time。
这里可能存在一个误区,那就是并不是只有检查点的情况下才会导致DBWR进程去写脏块到disk
中,在cache buffer 空间不足的情况下,由于Cache buffer LRU的机制就决定了不管是否发生
检查点,DBWR都会将脏块写入到disk中,以此来保证cache buffer能容纳更多的new block。
所谓的checkpoint queue,可以理解为由脏块组成的一个LRU链表。
检查点有哪些分类呢?大概有如下几种:
<div id="B" style="height:100px; width:70%;OVERFLOW-y:auto;border:blue 1px solid;margin:10px">
1. Full Checkpoint
2. Thread Checkpoint (local checkpoint, global checkpoint)
3. Datafile Checkpoint
4. Mini-checkpoint (object checkpoint,基于DDL)
5. Parallel Query Checkpoint
6. Incremental Checkpoint (Log Switch Checkpoint)
</div>
1. 首先我们来看下完全检查点,对于full checkpoint,在8i之前就存在了,很好理解,你目的是
一旦触发完全检查点,DBWR进程会将cache buffer drity LRU list上的所有脏块写入到disk中。
那么在哪些情况下会触发完全检查点呢?如下:
(1) shutdown instance;
(2) 日志组切换
(3) log_checkpoint_timeout,log_checkpoint_interval,fast_start_io_target,fast_start_mttr_target
(4) 手工执行alter system switch logfile时
(5) 手工alter system checkpoint
(6) alter tablespace XXX begin/end backup;
(7) alter tablespace XXX datafile offline;
注意: 在oracle 8i以后,引入增量检查点以后,日志切换以及switch logfile都是增量检查点,
不过需要说明一下的是,虽然说其是增量检查点,不过同时触发时controlfile和datafile header
都会进行更新的,后面的实验可以说明。
完全检查点就说到这里,至于局部检查点以及全局检查点,注意是针对RAC而言,可以这样理解:
alter system checkpoint local; 就是触发单实例的完全检查点
alter system checkpoint global; 就是RAC中所有实例同时触发完全检查点
2. 文件检查点
文件检查点相对完全检查点而言,你可以理解为属于其子集,其针对范围是某个表空间或表空间
中的某个数据文件,当执行如下命令的时候,会触发文件检查点:
alter tablespace XXX begin/end backup;
alter tablespace ,datafile offline;
下面通过bbed来验证一下: