Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2880702
  • 博文数量: 599
  • 博客积分: 16398
  • 博客等级: 上将
  • 技术积分: 6875
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-30 12:04
个人简介

WINDOWS下的程序员出身,偶尔也写一些linux平台下小程序, 后转行数据库行业,专注于ORACLE和DB2的运维和优化。 同时也是ios移动开发者。欢迎志同道合的朋友一起研究技术。 数据库技术交流群:58308065,23618606

文章分类

全部博文(599)

文章存档

2014年(12)

2013年(56)

2012年(199)

2011年(105)

2010年(128)

2009年(99)

分类: Oracle

2012-07-31 22:27:26

跳过归档日志的完全非常规恢复(一) http://blog.chinaunix.net/uid-22948773-id-3294762.html
跳过归档日志的完全非常规恢复(二) http://blog.chinaunix.net/uid-22948773-id-3294763.html
跳过归档日志的完全非常规恢复(三) http://blog.chinaunix.net/uid-22948773-id-3294767.html
跳过归档日志的完全非常规恢复(四) http://blog.chinaunix.net/uid-22948773-id-3294770.html
跳过归档日志的完全非常规恢复(五) http://blog.chinaunix.net/uid-22948773-id-3294773.html

我们采用diff命令来查看2个文件的不同之处:

 



 

点击(此处)折叠或打开

  1. [oracle@db2server ~]$ diff recover_sequence7.txt recover_sequence8.txt
  2. 13c13
  3. < ub2 chkval_kcbh @16 0xc785
  4. ---

  5. > ub2 chkval_kcbh @16 0xc404
  6. 27c27
  7. < ub4 kccfhcsq @40 0x00000325
  8. ---

  9. > ub4 kccfhcsq @40 0x00000327
  10. 83c83
  11. < ub4 kscnbas @484 0x000cf775
  12. ---

  13. > ub4 kscnbas @484 0x000cf786
  14. 85c85
  15. < ub4 kcvcptim @492 0x2f171759
  16. ---

  17. > ub4 kcvcptim @492 0x2f171773
  18. 89c89
  19. < ub4 kcrbaseq @500 0x00000008
  20. ---

  21. > ub4 kcrbaseq @500 0x00000009
  22. 101c101
  23. < ub4 kcvfhrts @144 0x2f171995
  24. ---

  25. > ub4 kcvfhrts @144 0x2f171ace
  26. [oracle@db2server ~]$


 

我们发现ORACLE一共改了6个地方:

偏移量16为块的校验值ub2 chkval_kcbh 原来为0xc785 后来为0xc404 

偏移量40control sequence ub4 kccfhcsq  原先为0x00000325 后来为0x00000327

偏移量484为 ub4 kscnbas     --SCN of last change to the datafile.

偏移量492为 ub4 kcvcptim    --Time of the last change to the datafile

偏移量500为 ub4 kcrbaseq    --RECOVER需要的下一个日志序列号

偏移量144,我也不知道是干啥的

重点修改的内容为偏移量484,偏移量492,偏移量500chkval_kcbh 最后通过bbed sum apply来得到,其他2个地方不修改问题也不大。

那么这3个地方要修改为啥呢?

偏移量484需要修改为需要归档日志文件的NEXT_CHANGE#

如下:

日志序列号7NEXT_CHANGE#为:

 


 

点击(此处)折叠或打开

  1. SQL> select to_number('cf775','xxxxxxxx') from dual;

  2. TO_NUMBER('CF775','XXXXXXXX')
  3. -----------------------------

  4.                        849781
  5.                        
  6. 日志序列号8的NEXT_CHANGE#为:

  7. SQL> select to_number('cf786','xxxxxxxx') from dual;

  8. TO_NUMBER('CF786','XXXXXXXX')
  9. -----------------------------

  10.                        849798


 

日志序列号9NEXT_CHANGE# 可以通过如下方式查到,就是849810,转为16进制就是0000cf792

 


 

点击(此处)折叠或打开

  1. SQL> select SEQUENCE#,FIRST_CHANGE#,FIRST_TIME ,NEXT_CHANGE#,NEXT_TIME from v$archived_log order by 1;

  2.  SEQUENCE# FIRST_CHANGE# FIRST_TIME NEXT_CHANGE# NEXT_TIME
  3. ---------- ------------- ------------------- ------------ -------------------

  4.          6 848360 2012-07-31 00:03:06 849604 2012-07-31 00:08:36
  5.          7 849604 2012-07-31 00:08:36 849781 2012-07-31 00:14:17
  6.          8 849781 2012-07-31 00:14:17 849798 2012-07-31 00:14:43
  7.          9 849798 2012-07-31 00:14:43 849810 2012-07-31 00:14:58
  8.         10 849810 2012-07-31 00:14:58 849819 2012-07-31 00:15:10
  9.         11 849819 2012-07-31 00:15:10 849834 2012-07-31 00:15:37

  10. 6 rows selected.


 

偏移量492需要修改为需要归档日志文件的NEXT_TIME#

但是这里存放的不是时间值,而是从198811日起到现在所经历的秒数。

看看前面的这2个值

<       ub4 kcvcptim                          @492      0x2f171759

---

>       ub4 kcvcptim                          @492      0x2f171773

 

 


 

点击(此处)折叠或打开

  1. SQL> select to_number('2f171759','xxxxxxxx') from dual;

  2. TO_NUMBER('2F171759','XXXXXXXX')
  3. --------------------------------

  4.                        790042457

  5. SQL> select to_number('2f171773','xxxxxxxx') from dual;

  6. TO_NUMBER('2F171773','XXXXXXXX')
  7. --------------------------------

  8.                        790042483

  9. SQL> select 790042483-790042457 from dual;

  10. 790042483-790042457
  11. -------------------

  12.      
  13.              26


 

         

从下面的查询我们也可以看到78NEXT_TIME就是差了26秒,89之间差了15秒。

 


 

点击(此处)折叠或打开

  1. SQL> select SEQUENCE#,NEXT_TIME from v$archived_log order by 1;

  2.  SEQUENCE# NEXT_TIME
  3. ---------- -------------------

  4.          6 2012-07-31 00:08:36
  5.          7 2012-07-31 00:14:17
  6.          8 2012-07-31 00:14:43
  7.          9 2012-07-31 00:14:58
  8.         10 2012-07-31 00:15:10
  9.         11 2012-07-31 00:15:37

  10. 6 rows selected.


 

因此这里存放的值修改为0x2f171773+15=790042483+15=790042498=0x2f171782

偏移量500更简单了修改为10就行了。


 

点击(此处)折叠或打开

  1. 有了上面的知识我们回到RECOVER窗口:


  2. SQL> recover datafile 6;
  3. ORA-00279: change 849630 generated at 07/31/2012 00:09:16 needed for thread 1
  4. ORA-00289: suggestion : /archivelog/1_7_789791289.dbf
  5. ORA-00280: change 849630 for thread 1 is in sequence #7


  6. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  7. /archivelog/1_7_789791289.dbf
  8. ORA-00279: change 849781 generated at 07/31/2012 00:14:17 needed for thread 1
  9. ORA-00289: suggestion : /archivelog/1_8_789791289.dbf
  10. ORA-00280: change 849781 for thread 1 is in sequence #8


  11. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  12. /archivelog/1_8_789791289.dbf
  13. ORA-00279: change 849798 generated at 07/31/2012 00:14:43 needed for thread 1
  14. ORA-00289: suggestion : /archivelog/1_9_789791289.dbf
  15. ORA-00280: change 849798 for thread 1 is in sequence #9


  16. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
  17. /archivelog/1_9_789791289.dbf
  18. ORA-00308: cannot open archived log '/archivelog/1_9_789791289.dbf'
  19. ORA-27037: unable to obtain file status
  20. Linux Error: 2: No such file or directory
  21. Additional information: 3


  22. Specify log: {<RET>=suggested | filename | AUTO | CANCEL}


  23. 我们在应用日志文件/archivelog/1_9_789791289.dbf的时候报错了,这也是意料之中的。


 

阅读(1935) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~