本来想好好写,但是经常被些事情中断掉,因此基础的东西就不写了。
我们知道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 0x099cRBA:
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"这样的错误,如果要跳过的归档日志很小的话那么可能会跳过去,如果归档日志很大的话时就说要跳过的数据很多,那么可能就恢复不了了,许多的客户都是到了数据丢失的时候才知道没有备份....
阅读(2937) | 评论(2) | 转发(0) |