关闭

检查点队列与日志的对应情况,实例恢复

标签: checkpoint queue实例恢复实例恢复对应日志
630人阅读 评论(0) 收藏 举报
分类:

首先想一个问题:检查点队列到底有什么用?

检查点队列按照块第一次被脏的时间点串起来

其实就是为了提高实例崩溃恢复的速度的~!有了检查点队列我们就能确定控制文件中记录的LRBA也可叫检查点位置,增量检查点,ckpt每个3秒写入控制文件),这个LRBA就是我们实例恢复的起点~!

增量检查点就是为了更新控制文件的LRBA.

在8i之前,没有检查点队列,在实例崩溃的时候,oracle会把整个的current redo log跑一遍,这样太费时间了,所以引入了检查点队列~!



上图:




查看检查点队列(checkpoint queue)上的的脏块树,和控制文件中记录的LRBA、on disk rba

select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low  
RBA",CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT from x$kcccp;
CPDRT列是检查点队列中的脏块数目. 

CPODS列是on disk rba的scn 
CPODT列是on disk rba的时间戳 
CPHBT列是心跳





实例恢复(在内存中恢复那些提交了,但没来得及写的脏块): 

起点:LRBA    (在current redolog上,在控制文件中记录,ckpt负责更新)         --检查点位置

终点:on disk RBA  (current redolog的最后)

在这一段日志中(LRBA---on disk RBA)中,有我检查点队列上所有提交了的脏块,而检查点队列串着buffer cache中所有脏块,所以这段日志就能构造出内存中所有提交了的脏块


这就是实例恢复需要跑的日志,通过跑这段日志,就能构造出崩溃时内存中所有提交了的脏块,当然也会构造出一些未提交的脏块,不过没关系,oracle会将未提交的脏块回滚!这样就能保证我已经commit的事物不会丢失


实例恢复两个阶段:①前滚(跑这段日志构造脏块)、②后滚(回滚没有commit的脏块)




有空可以看一下这个帖子,增量检查点和完全检查点:http://www.itpub.net/thread-330591-1-1.html


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:36234次
    • 积分:837
    • 等级:
    • 排名:千里之外
    • 原创:48篇
    • 转载:12篇
    • 译文:0篇
    • 评论:1条