Chinaunix首页 | 论坛 | 博客
  • 博客访问: 288098
  • 博文数量: 60
  • 博客积分: 1437
  • 博客等级: 中尉
  • 技术积分: 632
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-10 14:12
文章存档

2012年(7)

2011年(53)

分类: Oracle

2011-02-28 10:35:16

本来想好好写,但是经常被些事情中断掉,因此基础的东西就不写了。
我们知道oracle恢复的基础依赖于2个东西,一个是SCN,一个是RBA,SCN有2部分组成,RBA由3部分组成:
SCN = scnBase.scnWrap
RBA = log sequence number + log file block number + offset
  • the log file sequence number (4 bytes)
  • the log file block number (4 bytes)
  • the byte offset into the block at which the redo record starts (2 bytes)
SCN:

BBED> p kcvfhckp
struct kcvfhckp, 160 bytes                  @484    
   struct kcvcpscn, 8 bytes                 @484    
      ub4 kscnbas                           @484      0x1b7b517a
      ub2 kscnwrp                           @488      0x099c

RBA:
BBED> p kcvfhckp
struct kcvfhckp, 160 bytes                  @484    
   struct kcvcpscn, 8 bytes                 @484    
      ub4 kscnbas                           @484      0x1b7b517a
      ub2 kscnwrp                           @488      0x099c
   ub4 kcvcptim                             @492      0x2c5ce2c0
   ub2 kcvcpthr                             @496      0x0001
   union u, 12 bytes                        @500    
      struct kcvcprba, 12 bytes             @500    
         ub4 kcrbaseq                       @500      0x00002a89
         ub4 kcrbabno                       @504      0x00000002
         ub2 kcrbabof                       @508      0x0010

   ub1 kcvcpetb[0]                          @512      0x02
   ... ...
   ub1 kcvcpetb[128]                        @640      0x00
所以,要跳过一个归档日志,我们修改SCN和RBA就可以了,那么修改成什么值呢?就是要跳过的归档日志的下一个归档日志中记录的SCN和RBA值!修改datafile header与其保持一致就可以了,SCN,及RBA的log sequence可以从v$log_history中找出来, log file block number及offset可以将归档日志dump出来查看,经过我的观察,归档日志的起始地址随后都是:baseRBA.00000002.0010
REDO RECORD - Thread:1 RBA: 0x001e64.00000002.0010 LEN: 0x0054 VLD: 0x01
SCN: 0x0000.4b6ca745 SUBSCN:  1 09/04/2010 19:54:42
CHANGE #1 TYP:0 CLS:21 AFN:2 DBA:0x00800029 SCN:0x0000.4b6ca73f SEQ:  2 OP:5.4
ktucm redo: slt: 0x002d sqn: 0x0011c70e srt: 0 sta: 9 flg: 0x2
ktucf redo: uba: 0x0080085a.5b38.34 ext: 2 spc: 3414 fbi: 0

注意,所有的datafile header都需要修改,当然temp文件除外了!

修改完成后,做恢复时,可能会遇到ORA-600 [3020] "Stuck Recovery"这样的错误,如果要跳过的归档日志很小的话那么可能会跳过去,如果归档日志很大的话时就说要跳过的数据很多,那么可能就恢复不了了,许多的客户都是到了数据丢失的时候才知道没有备份....



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

xifenfei2011-10-31 14:26:12

经常数据文件离线,又没有归档日志恢复的时候,会用到这招

itpub.com.cn2011-02-28 11:06:10

ORA-600 [3020] "Stuck Recovery" [ID 30866.1]
   Modified 11-FEB-2011     Type REFERENCE     Status PUBLISHED         


Note: For additional ORA-600 related information please read Note:146580.1

PURPOSE:
  This article discusses the internal error "ORA-600 [3020]", what
  it means and possible actions. The information h