oracle底层实操恢复记录
# 一起oracle底层实操恢复记录[2025-11-07]
上周,一个朋友找到我,说某个核心库无法打开,问我能不能修复。
在找我之前其它dba已经看过和尝试过多次,恢复不出来。
我通过远程分析,发现操作系统磁盘损坏导致SYSTEM等出现了坏块,在OPen过程中报错了。
通过文件分析,发现核心的确实存在一些坏块...控制文件损坏、rman备份不完整等导致无法使用正常手段恢复。
一、恢复思路
做任何事情我们都讲究方式方法,不能盲目的弄。我整理的思路如下:
a) 判断损坏的情况
b) 判断数据库版本、大小
c) 判断备份可用程度
d) 跳过控制文件的还原,直接尝试恢复坏块的文件,如SYSTEM01.DBF...
e) 将服务器本地的文件压缩了,通过网盘传输到自己的环境进行恢复。
f) 恢复完成后,拷贝回用户的环境。
二、恢复概要
一)、拿到好的文件
挨着尝试恢复指定的备份集,发现只有一个2021年的备份可用。先在nomount装下恢复出来再说。
二)、确定数据块损坏情况
通过下图可以看到,坏块还是比较多,看16进制发现,数据库还是OK的,只是CHecksum值有问题。
三)、拷贝到本机后第一次恢复
单system起库报错:ORA-01092--从上面可以看到是报了ORA-01173才导致实例终止的问题:
--做过恢复的都知道,这个错误是由于去找undo块导致的;解决办法,频闭undo或者删除undo块中的回滚段;11g undo$在 file 1 block 224
10g在file 1 block 105位置 --段头
[oracle@hisdb01 ~]$ bbed parfile=bbed.par
BBED: Release 2.0.0.0.0 - Limited Production on Fri Nov 7 14:31:58 2025
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> info all
File# Name Size(blks)
----- ---- ----------
1 /home/oracle/SYSTEM01.DBF 0
BBED> set file 1 block 105
FILE# 1
BLOCK# 105
BBED> map
File: /home/oracle/SYSTEM01.DBF (1)
Block: 105 Dba:0x00400069
------------------------------------------------------------
Unlimited Data Segment Header
struct kcbh, 20 bytes @0
struct ktech, 72 bytes @20
struct ktemh, 16 bytes @92
struct ktetb[1], 8 bytes @108
struct ktshc, 8 bytes @4148
struct ktsfs_seg[1], 20 bytes @4156
struct ktsfs_txn[16], 320 bytes @4176
ub4 tailchk @8188
BBED> p ktech.hwmark_ktech.blkno_ktehw
ub4 blkno_ktehw @52 0x00000001 --高水位下只有一个快被使用;
BBED> p /d ktetb
struct ktetb[0], 8 bytes @108
ub4 ktetbdba @108 4194410 --第一个快是这个,后面的七个块未使用;也就是说把这个块里面记录的undo信息找出来即可;
ub4 ktetbnbk @112 7
BBED> set dba 4194410
DBA 0x0040006a (4194410 1,106)
BBED> map
File: /home/oracle/SYSTEM01.DBF (1)
Block: 106 Dba:0x0040006a
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 48 bytes @20
struct kdbh, 14 bytes @68
struct kdbt[1], 4 bytes @82
sb2 kdbr[67] @86 --67行(0-66)
ub1 freespace[2883] @220
ub1 rowdata[5085] @3103
ub4 tailchk @8188
继续打开库恢复...
--再次观察错误,发现是dbf有坏块导致无法启动,关键错误ora-01578,这个错误就是之前dba遇到的故障;6360不就是上面扫出来的坏块吗,哈哈
四)、拷贝到本机后第二次恢复
SQL> oradebug tracefile_name
f:\app\wang\product\10.2.0.4\admin\o10204\udump\o10204_ora_35240.trc
SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01092: ORACLE 实例终止。强制断开连接
五)、修复坏块
[oracle@hisdb01 ~]$ bbed parfile=bbed.par BBED: Release 2.0.0.0.0 - Limited Production on Fri Nov 7 14:42:32 2025
Copyright (c) 1982, 2007, Oracle. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set file 1 block 6360
FILE# 1
BLOCK# 6360
BBED> v
DBVERIFY - Verification starting
FILE = /home/oracle/SYSTEM01.DBF
BLOCK = 6360
Block 6360 is corrupt
Corrupt block relative dba: 0x004018d8 (file 0, block 6360)
Fractured block found during verification
Data in bad block:
type: 6 format: 2 rdba: 0x004018d8
last change scn: 0x0000.7fa8ef6e seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xd9530601 --应该是ef6e0601 base后四位+type+seq, 这里是tail值对不上
check value in block header: 0x6027
computed block checksum: 0x363d
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 1
Total Blocks Influx : 2
--可以看到确实存在坏块
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x004018d8
ub4 bas_kcbh @8 0x7fa8ef6e
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0x561a
ub2 spare3_kcbh @18 0x0000
BBED> set block +1
BLOCK# 6361
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x004018d9
ub4 bas_kcbh @8 0x000065dd
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x02
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0x4c00
ub2 spare3_kcbh @18 0x0000
6359 scn是:0x0000.0000c3e5
6360 scn是:0x0000.7fa8ef6e
6361 scn是:0x0000.000065dd
6362 scn是:0x0000.00006731
修改tailchk值:为01066eef 或者修改base值也行;
set block 6360
BBED> d /v offset 8188
File: /home/oracle/SYSTEM01.DBF (1)
Block: 6360 Offsets: 8188 to 8191 Dba:0x004018d8
-------------------------------------------------------
010653d9 l ..S.
m /x 6eef dba 1,6360 offset 8190
BBED> sum apply
Check value for File 1, Block 6360:
current = 0x6027, required = 0x6027
BBED> v
DBVERIFY - Verification starting
FILE = /home/oracle/SYSTEM01.DBF
BLOCK = 6360
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 1
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
其它坏块修复
[oracle@hisdb01 ~]$ dbv file=SYSTEM01.DBF
DBVERIFY: Release 10.2.0.4.0 - Production on Fri Nov 7 15:06:11 2025
Copyright (c) 1982, 2007, Oracle. All rights reserved.
DBVERIFY - Verification starting : FILE = SYSTEM01.DBF
Page 4120 is influx - most likely media corrupt
Corrupt block relative dba: 0x00401018 (file 1, block 4120)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00401018
last change scn: 0x0000.7f5ae662 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xf1ed0601
check value in block header: 0xcc0c
computed block checksum: 0x148c
Page 18008 is influx - most likely media corrupt
Corrupt block relative dba: 0x00404658 (file 1, block 18008)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00404658
last change scn: 0x0000.7f396d74 seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x2f3c0601
check value in block header: 0xa320
computed block checksum: 0x7629
Page 27640 is influx - most likely media corrupt
Corrupt block relative dba: 0x00406bf8 (file 1, block 27640)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00406bf8
last change scn: 0x0000.7fa8eca3 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xd6f40601
check value in block header: 0xb8fc
computed block checksum: 0xc70b
Page 60792 is influx - most likely media corrupt
Corrupt block relative dba: 0x0040ed78 (file 1, block 60792)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0040ed78
last change scn: 0x0000.7fa8ce11 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x1d0f0601
check value in block header: 0xb831
computed block checksum: 0xd31e
Page 60888 is influx - most likely media corrupt
Corrupt block relative dba: 0x0040edd8 (file 1, block 60888)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0040edd8
last change scn: 0x0000.7fa3653b seq: 0x2 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xaf400602
check value in block header: 0x9523
computed block checksum: 0xca7b
Page 61368 is influx - most likely media corrupt
Corrupt block relative dba: 0x0040efb8 (file 1, block 61368)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x0040efb8
last change scn: 0x0000.7f9ce6c0 seq: 0x1 flg: 0x04
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x42db0601
check value in block header: 0x1fb
computed block checksum: 0x9a4d
Page 74098 is influx - most likely media corrupt
Corrupt block relative dba: 0x00412172 (file 1, block 74098)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00412172
last change scn: 0x0000.7f398ba0 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x81180601
check value in block header: 0x807b
computed block checksum: 0x9e47
Page 80590 is influx - most likely media corrupt
Corrupt block relative dba: 0x00413ace (file 1, block 80590)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00413ace
last change scn: 0x0000.7fa01f53 seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0x28950601
check value in block header: 0x49f
computed block checksum: 0x92e1
Page 81097 is influx - most likely media corrupt
Corrupt block relative dba: 0x00413cc9 (file 1, block 81097)
Fractured block found during dbv:
Data in bad block:
type: 6 format: 2 rdba: 0x00413cc9
last change scn: 0x0000.7fa8ef6e seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xd9530601
check value in block header: 0xbf56
computed block checksum: 0x450a
DBVERIFY - Verification complete
Total Pages Examined : 131072
Total Pages Processed (Data) : 60620
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 14772
Total Pages Failing (Index): 0
Total Pages Processed (Other): 1909
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 53762
Total Pages Marked Corrupt : 9
Total Pages Influx : 9
Highest block SCN : 3221285612 (0.3221285612)
m /x 6eef dba 1,6360 offset 8190
m /x 62e6 dba 1,4120 offset 8190
m /x 746d dba 1,18008 offset 8190
m /x a3ec dba 1,27640 offset 8190
m /x 11ce dba 1,60792 offset 8190
m /x 3b65 dba 1,60888 offset 8190
m /x c0e6 dba 1,61368 offset 8190
m /x a08b dba 1,74098 offset 8190
m /x 531f dba 1,80590 offset 8190
m /x 6eef dba 1,81097 offset 8190
sum dba 1,6360 apply
sum dba 1,4120 apply
sum dba 1,18008 apply
sum dba 1,27640 apply
sum dba 1,60792 apply
sum dba 1,60888 apply
sum dba 1,61368 apply
sum dba 1,74098 apply
sum dba 1,80590 apply
sum dba 1,81097 apply
或者dd替换好的块到坏的块,但这种处理需要考虑到以前的块号是索引还是数据,会存在大量的8102错误。(部分块不完全是修改这个tail,还有空间问题,itl信息... 行锁标记等)
dd if=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSTEM01_OK\SYSTEM01.DBF of=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSTEM01.DBF bs=8192 skip=4120 seek=4120 count=1 conv=notrunc
dd if=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSTEM01_OK\SYSTEM01.DBF of=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSTEM01.DBF bs=8192 skip=18008 seek=18008 count=1 conv=notrunc
...
dbv file=F:\app\wang\product\10.2.0.4\oradata\oradata\orcl_old\SYSAUX01.DBF LOGFILE=d:\1.txt
[oracle@wx ~]$ cat test.txt |grep '(file'|wc -l
264
[oracle@wx ~]$ cat test.txt |grep '(file'
Corrupt block relative dba: 0x00c10b19 (file 3, block 68377)
Corrupt block relative dba: 0x00c10b59 (file 3, block 68441)
Corrupt block relative dba: 0x00c10b79 (file 3, block 68473)
上传到linux生成修改命令;
cat test.txt|grep '(file'| sed -n 's/.*block \([0-9]\+\).*/\1/p' | whileread block; do
echo"dd if=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSTEM01_OK\SYSAUX01.DBF of=F:\app\wang\product\10.2.0.4\oradata\o10204\SYSAUX01.DBF bs=8192 skip=$block seek=$block count=1 conv=notrunc";
done
处理后,打开库
六)、修复坏块导出数据库重建恢复
select UTL_RAW.CAST_TO_NUMBER(replace('c3 14 46 0c',' ','')) from dual; --196911
可以看到数据块期望的值是196911三、总结
本次恢复还是比较复杂,遇到的报错比较多,这里主要记录几个核心的错误,其它报错类似,处理方法也类似。只要会底层数据块的修改,恢复的思路基本上就是固定的方法。