青年数据库学习互助会

oracle底层实操恢复记录

# 一起oracle底层实操恢复记录[2025-11-07]

上周,一个朋友找到我,说某个核心库无法打开,问我能不能修复。
在找我之前其它dba已经看过和尝试过多次,恢复不出来。
我通过远程分析,发现操作系统磁盘损坏导致SYSTEM等出现了坏块,在OPen过程中报错了。
通过文件分析,发现核心的确实存在一些坏块...

控制文件损坏、rman备份不完整等导致无法使用正常手段恢复。

Image
Image

一、恢复思路

做任何事情我们都讲究方式方法,不能盲目的弄。我整理的思路如下:
a) 判断损坏的情况
b) 判断数据库版本、大小
c) 判断备份可用程度
d) 跳过控制文件的还原,直接尝试恢复坏块的文件,如SYSTEM01.DBF...
e) 将服务器本地的文件压缩了,通过网盘传输到自己的环境进行恢复。
f) 恢复完成后,拷贝回用户的环境。

二、恢复概要

一)、拿到好的文件

挨着尝试恢复指定的备份集,发现只有一个2021年的备份可用。先在nomount装下恢复出来再说。
Image

二)、确定数据块损坏情况

通过下图可以看到,坏块还是比较多,看16进制发现,数据库还是OK的,只是CHecksum值有问题。
Image

三)、拷贝到本机后第一次恢复

单system起库报错:ORA-01092
Image
Image
--从上面可以看到是报了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不就是上面扫出来的坏块吗,哈哈

Image

四)、拷贝到本机后第二次恢复

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

处理后,打开库

Image
Image

六)、修复坏块导出数据库重建恢复

select UTL_RAW.CAST_TO_NUMBER(replace('c3 14 46 0c',' ','')) from dual;  --196911
可以看到数据块期望的值是196911
Image
Image

三、总结

本次恢复还是比较复杂,遇到的报错比较多,这里主要记录几个核心的错误,其它报错类似,处理方法也类似。只要会底层数据块的修改,恢复的思路基本上就是固定的方法。