增量检查点和实例恢复的关系

我一直以为如果不久前刚刚触发了增量检查点,那么如果实例要进行恢复的话,必须要从这个增量检查点开始应用redo。
但是最近发现不完全是这样的,所以通过以下试验来阐述.


1:记录增量检查点的时间

(1)SYS@test >alter system set log_checkpoints_to_alert=true;--参数为true,检查点记录到alert日志中
(2)SYS@test >alter system set log_checkpoint_timeout=300;----默认1800s,改为300s方便模拟

截取日志中增量检查点信息:

Incremental checkpoint up to RBA [0x5a.81.0], current log tail at RBA [0x5a.a7.0]
RBA [0x5a.81.0]:记录了增量检查点所在的序列号和所在日志的块号
把上面的16进制的rba转换成十进制为:5*16+10=90---日志序列号 8*16+1=129---块号
RBA [0x5a.a7.0]:记录了当前最后一条记录所在的序列号和块号

2:增加redo 记录
(1)首先通过x$kcccp这个表来获取必要信息 
CPLRBA_SEQ:当前检查点(即lrba)所在的日志序列号
CPLRBA_BNO:当前检查点所在的块号
CPODR_SEQ:当前最后一条redo记录所在的日志的序列号
CPODR_BNO:当前最后一条redo记录所在的块号
SQL> select CPLRBA_SEQ,CPLRBA_BNO,CPODR_SEQ,CPODR_BNO from x$kcccp where rownum=1;
CPLRBA_SEQ CPLRBA_BNO  CPODR_SEQ  CPODR_BNO
---------- ---------- ---------- ----------
        90        129         90        172
(2)通过update语句产生redo log
SYS@test >update t set object_id=1 where rownum=1;
1 row updated.
SYS@test >commit;
(3)再次获得当前的检查点位置和最后一条日志记录的块号
Commit complete.
SQL> select CPLRBA_SEQ,CPLRBA_BNO,CPODR_SEQ,CPODR_BNO from x$kcccp where rownum=1;
CPLRBA_SEQ CPLRBA_BNO  CPODR_SEQ  CPODR_BNO
---------- ---------- ---------- ----------
        90        154         90       1556
推测154-1556之间的redo块是要被拿来实例恢复的,所用的日志大小如下所示;
SYS@test >select (1556-154)*512/1024 from dual;

(1556-154)*512/1024
-------------------
                701

3:查看数据库中的脏块
SQL> select count(1) from v$bh where dirty='Y';
  COUNT(1)
----------
       156
4:shutdown abort
SYS@test >shutdown abort;
ORACLE instance shut down.
5 :starup database,观察日志
ALTER DATABASE OPEN
Beginning crash recovery of 1 threads
Started redo scan
Completed redo scan
 read 701 KB redo, 156 data blocks need recovery
Started redo application at
 Thread 1: logseq 90, block 154
Recovery of Online Redo Log: Thread 1 Group 3 Seq 90 Reading mem 0
  Mem# 0: /u01/app/oracle/oradata/test/redo03.log
Completed redo application of 0.23MB
Completed crash recovery at
 Thread 1: logseq 90, block 1556, scn 4754177
  156 data blocks read, 156 data blocks written, 701 redo k-bytes read


从截取的日志中可以看到,实例恢复完成后,有156个块被处理。读取了701kb redo,即1402个redo block,这点和上述的猜测一致。


通过试验,看到增量检查点只是检查点的一个类型,数据库的实例恢复是从最新的一个检查点(lrba)开始
应用redo block进行恢复的。如果增量检查点是最新的检查点,即和x$kcccp中的CPLRBA_BNO字段值相同,则可以作为实例恢复的起点。


end!

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25923810/viewspace-1070592/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25923810/viewspace-1070592/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值