本文结合Eygle大师的力作《深入解析oracle》一书中有关Checkpoint一节内容以及网上其它同学的相关知识,加上自己的理解,并配上实例深入的去理解Checkpoint的机制,如有不对的地方还请高手指点,希望与各位共同学习。欢迎转载,转载请注明出处。
1、坚持点的基础知识
3、常规坚持点和增量检查点
Beginning log switch checkpoint up to RBA [0x1760f.2.10], SCN: 8486535249241 Thread 1 advanced to log sequence 95759 Current log# 8 seq# 95759 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo08.log Thu Mar 17 10:29:24 2011 Completed checkpoint up toRBA [0x1760f.2.10], SCN: 8486535249241 Thu Mar 17 10:32:37 2011 Beginning log switch checkpoint up toRBA [0x17610.2.10], SCN: 8486536488869 Thread 1 advanced to log sequence 95760 Current log# 9 seq# 95760 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo09.log Thu Mar 17 10:33:37 2011 Beginning log switch checkpoint up toRBA [0x17611.2.10], SCN: 8486536865326 Thread 1 advanced to log sequence 95761 Current log# 10 seq# 95761 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo10.log Thu Mar 17 10:33:57 2011 Beginning log switch checkpoint up toRBA [0x17612.2.10], SCN: 8486536868604 Thread 1 advanced to log sequence 95762 Current log# 11 seq# 95762 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo11.log Beginning log switch checkpoint up toRBA [0x17613.2.10], SCN: 8486536870570 Thread 1 advanced to log sequence 95763 Current log# 12 seq# 95763 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo12.log Thu Mar 17 10:34:43 2011 Beginning log switch checkpoint up toRBA [0x17614.2.10], SCN: 8486537091802 Thread 1 advanced to log sequence 95764 Current log# 4 seq# 95764 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo04.log Beginning log switch checkpoint up toRBA [0x17615.2.10], SCN: 8486537092511 Thread 1 advanced to log sequence 95765 Current log# 1 seq# 95765 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo01.log Thu Mar 17 10:34:58 2011 Beginning log switch checkpoint up toRBA [0x17616.2.10], SCN: 8486537098178 Thread 1 advanced to log sequence 95766 Current log# 2 seq# 95766 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo02.log Beginning log switch checkpoint up toRBA [0x17617.2.10], SCN: 8486537098724 Thread 1 advanced to log sequence 95767 Current log# 3 seq# 95767 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo03.log Beginning log switch checkpoint up toRBA [0x17618.2.10], SCN: 8486537099018 Thread 1 advanced to log sequence 95768 Current log# 5 seq# 95768 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo05.log Thu Mar 17 10:35:21 2011 Beginning log switch checkpoint up toRBA [0x17619.2.10], SCN: 8486537111235 Thread 1 advanced to log sequence 95769 Current log# 6 seq# 95769 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo06.log Beginning log switch checkpoint up toRBA [0x1761a.2.10], SCN: 8486537111653 Thread 1 advanced to log sequence 95770 Current log# 7 seq# 95770 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo07.log Thread 1 cannot allocate new log, sequence 95771 Checkpoint not complete Current log# 7 seq# 95770 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo07.log Thu Mar 17 10:35:26 2011 Beginning log switch checkpoint up to RBA [0x1761a.2.10], SCN: 8486537111653 Thread 1 advanced to log sequence 95770 Current log# 7 seq# 95770 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo07.log Thread 1 cannot allocate new log, sequence 95771 Checkpoint not complete Current log# 7 seq# 95770 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo07.log Thu Mar 17 10:35:26 2011 Completed checkpoint up to RBA [0x17610.2.10], SCN: 8486536488869 Thu Mar 17 10:35:26 2011 Beginning log switch checkpoint up to RBA [0x1761b.2.10], SCN: 8486537113134 Thread 1 advanced to log sequence 95771 Current log# 8 seq# 95771 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo08.log Thu Mar 17 10:37:55 2011 WARNING: inbound connection timed out (ORA-3136) Thu Mar 17 10:38:42 2011 Completed checkpoint up to RBA [0x17611.2.10], SCN: 8486536865326 Thu Mar 17 10:39:03 2011 Completed checkpoint up to RBA [0x17612.2.10], SCN: 8486536868604 Completed checkpoint up to RBA [0x17613.2.10], SCN: 8486536870570 Thu Mar 17 10:39:15 2011 Incremental checkpoint up to RBA [0x17613.2068.0], current log tail at RBA [0x1761b.6ae1c.0] Thu Mar 17 10:39:48 2011 Completed checkpoint up to RBA [0x17614.2.10], SCN: 8486537091802 Completed checkpoint up to RBA [0x17615.2.10], SCN: 8486537092511 Thu Mar 17 10:40:03 2011 Completed checkpoint up to RBA [0x17617.2.10], SCN: 8486537098724 Completed checkpoint up to RBA [0x17616.2.10], SCN: 8486537098178 Completed checkpoint up to RBA [0x17618.2.10], SCN: 8486537099018 Thu Mar 17 10:40:27 2011 Completed checkpoint up to RBA [0x1761a.2.10], SCN: 8486537111653 Completed checkpoint up to RBA [0x17619.2.10], SCN: 8486537111235 Completed checkpoint up to RBA [0x1761b.2.10], SCN: 8486537113134 Thu Mar 17 10:46:42 2011 |
Beginning log switch checkpoint up to RBA [0x1761c.2.10], SCN: 8486539011972 Thread 1 advanced to log sequence 95772 Current log# 9 seq# 95772 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo09.log Thu Mar 17 10:51:48 2011 Completed checkpoint up to RBA [0x1761c.2.10], SCN: 8486539011972 |
Beginning log switch checkpoint up to RBA [0x17620.2.10], SCN: 8486544501469 Thread 1 advanced to log sequence 95776 Current log# 4 seq# 95776 mem# 0: /paic/bj/lbs/redo/oradata/lubj0/redo04.log Thu Mar 17 11:13:21 2011 Beginning global checkpoint up to RBA [0x17620.7.10], SCN: 8486544501473 Completed checkpoint up to RBA [0x17620.7.10], SCN: 8486544501473 Completed checkpoint up to RBA [0x17620.2.10], SCN: 8486544501469 Thu Mar 17 11:13:22 2011 |
4、检查点(checkpoint)的工作机制
检查点分为三类:
1)局部检查点:单个实例执行数据库所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。
触发命令:
svmrgrl>alter system checkpoint local;
这条命令显示的触发一个局部检查点。
2)全局检查点:所有实例(对应并行数据服务器)执行数据库所有所有数据文件的一个检查点操作,属于此实例的全部脏缓存区写入数据文件。
触发命令
svrmgrl>alter system checkpoint global;
这条命令显示的触发一个全局检查点。
3)文件检查点:所有实例需要执行数据文件集的一个检查点操作,如使用热备份命令alter tablespace USERS begin backup,或表空间脱机命令alter tablespace USERS offline,将执行属于USERS表空间的所有数据文件的一个检查点操作。
检查点处理步骤:
1)获取实例状态队列:实例状态队列是在实例状态转变时获得,ORACLE获得此队列以保证检查点执行期间,数据库处于打开状态;
2)获取当前检查点信息:获取检查点记录信息的结构,此结构包括当前检查点时间、活动线程、进行检查点处理的当前线程、日志文件中恢复截止点的地址信息;
3)缓存区标识:当数据在buffer cache中做了修改之后会自动被为脏缓冲区,加入到Checkpoint Queue的脏缓冲区队列。
注:控制文件与数据文件头包含检查点结构信息。
在两种情况下,文件头中的检查点信息(获取当前检查点信息时)将不做更新:
1)数据文件不处于热备份方式,此时ORACLE将不知道操作系统将何时读文件头,而备份拷贝在拷贝开始时必须具有检查点SCN;
ORACLE在数据文件头中保留一个检查点的记数器,在正常操作中保证使用数据文件的当前版本,在恢复时防止恢复数据文件的错误版本;即使在热备份方式下,计数器依然是递增的;每个数据文件的检查点计数器,也保留在控制文件相对应数据文件项中。
2)检查SCN小于文件头中的检查点SCN的时候,这表明由检查点产生的改动已经写到磁盘上,在执行全局检查点的处理过程中,如果一个热备份快速检查点在更新文件头时,则可能发生此种情况。应该注意的是,ORACLE是在实际进行检查点处理的大量工作之前捕获检查SCN的,并且很有可能被一条象热备份命令 alter tablespace USERS begin backup进行快速检查点处理时的命令打断。
ORACLE在进行数据文件更新之前,将验证其数据一致性,当验证完成,即更新数据文件头以反映当前检查点的情况;未经验证的数据文件与写入时出现错误的数据文件都被忽略;如果日志文件被覆盖,则这个文件可能需要进行介质恢复,在这种情况下,ORACLE系统进程DBWR将此数据文件脱机。
检查点算法描述:
脏缓存区用一个新队列链接,称为检查点队列。对缓存区的每一个改动,都有一个与其相关的重做值。检查点队列包含脏的日志缓存区,这些缓存区按照它们在日志文件中的位置排序,即在检查点队列中,缓存区按照它们的LRBA进行排序。需要注意的是,由于缓存区是依照第一次变脏的次序链接到队列中的,所以,如果在缓存区写出之前对它有另外的改动,链接不能进行相应变更,缓存区一旦被链接到检查点队列,它就停留在此位置,直到将它被写出为止。
ORACLE系统进程DBWR在响应检查点请求时,按照这个队列的LRBA的升序写出缓存区。每个检查点请求指定一个重做值,一旦DBWR写出的缓存区重做值等于或大雨检查点的重做值,检查点处理即完成,并将记录到控制文件与数据文件。
由于检查点队列上的缓存区按照低重做值进行排序,而DBWR也按照低重做值顺序写出检查点缓存区,故可能有多个检查点请求处于活动状态,当DBWR写出缓存区时,检查位于检查点队列前端的缓存区重做值与检查点重做值的一致性,如果重做值小于检查点队列前缓存区的低重做值的所有检查点请求,即可表示处理完成。当存在未完成的活动检查点请求时,DBWR继续写出检查点缓存区。
算法特点:
1)DBWR能确切的知道为满足检查点请求需要写那些缓存区;
2)在每次进行检查点写时保证指向完成最早的(具有最低重做值的)检查点;
3)根据检查点重做值可以区别多个检查点请求,然后按照它们的顺序完成处理。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26043157/viewspace-704447/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26043157/viewspace-704447/