本文转自http://www.cnblogs.com/Ronger/archive/2011/12/09/2281650.html
经过ronger这篇文章的学习了解,对检查点的了解更清晰了许多。复制到个人博中做一学习记录。
关于检查点的详细内容请看上面的链接地址。绝对有收获!
1.检查点(Checkpoint)的本质
许多文档把Checkpint描述得非常复杂,为我们正确理解检查点带来了障碍,结果现在检查点变成了一个非常复杂的问题。实际上,检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复(Crash Recovery)时间。
当修改数据时,需要首先将数据读入内存中(Buffer Cache),修改数据的同时,Oracle会记录重做信息(Redo)用于恢复。因为有了重做信息的存在,Oracle不需要在提交时立即将变化的数据写回磁盘(立即写的效率会很低),重做(Redo)的存在也正是为了在数据库崩溃之后,数据就可以恢复。
最常见的情况,数据库可以因为断电而Crash,那么内存中修改过的、尚未写入文件的数据将会丢失。在下一次数据库启动之后,Oracle可以通过重做日志(Redo)进行事务重演,也就是进行前滚,将数据库恢复到崩溃之前的状态,然后数据库可以打开提供使用,之后Oracle可以将未提交的数据进行回滚。
在这个过程中,通常大家最关心的是数据库要经历多久才能打开。也就是需要读取多少重做日志才能完成前滚。当然用户希望这个时间越短越好,Oracle也正是通过各种手段在不断优化这个过程,缩短恢复时间。
检查点的存在就是为了缩短这个恢复时间。
当检查点发生时(此时的SCN被称为CheckPoint SCN),Oracle会通知DBWR进程,把修改过的数据,也就是Checkpoint SCN之前的脏数据(Dirty Data)从Buffer Cache写入磁盘,当写入完成之后,CKPT进程更新控制文件和数据文件头,记录检查点信息,标识变更。
Oracle SCN的相关知识可以参考我的另外一篇文章:DBA入门之认识Oracle SCN(System Change Number)
Checkpoint SCN可以从数据库中查询得到:
FILE # CHECKPOINT_CHANGE# CPT
-- -------- ------------------ -------------------
1 913306 2011 - 11 - 16 16 : 06 : 06
2 913306 2011 - 11 - 16 16 : 06 : 06
3 913306 2011 - 11 - 16 16 : 06 : 06
4 913306 2011 - 11 - 16 16 : 06 : 06
SQL > select dbid,CHECKPOINT_CHANGE# from v$ database ;
DBID CHECKPOINT_CHANGE#
-- -------- ------------------
1294662348 913306
更进一步可以知道,如果Oracle可以在性能允许的情况下,使得检查点的SCN主键逼近Redo的最新更新,那么最终可以获得一个最佳平衡点,使得Oracle可以最大化地减少恢复时间。
为了实现这个目标,Oracle在不同版本中一直在改进检查点的算法。
2.常规检查点与增量检查点
为了区分,在Oracle8之前,Oracle实时的检查点通常被称为常规检查点(Conventional Checkpoint),这类检查点按一定的条件出发(log_checkpoint_interval、log_checkpoint_timeout参数设置及log switch等条件出发)。
从Oracle 8开始,Oracle引入了增量检查点(Inctrmental Checkpoint)的概念。
和以前的版本相比,在新版本中,Oracle主要引入了检查点队列(Checkpoinnt Queue)机制,在数据库内部,每一个脏数据块都会被移动到检查点队列,按照Low RBA的顺序(第一次对比数据块修改对应的Redo Byte Address)来排列,如果一个数据块进行过多次修改,该数据库在检查点队列上的顺序并不会发生变化。
当执行检查点时,DBWR从检查点队列按照Low RBA的顺序写出,实例检查点因此可以不断增进、阶段性的,CKPT进程使用非常轻量级的控制文件更新协议,将当前的最低RBA写入控制文件。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23891491/viewspace-747890/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/23891491/viewspace-747890/