最近处理了一个比较复杂的恢复,使用了十八般武艺基本上完成了恢复,最大限度恢复客户的数据
故障背景
1. 客户两个1.8T盘做raid 1,操作系统是linux(分区swap,/ [lv方式])运行oracle数据库(跑的是一家医院的his系统),前些年一直这样运行
2. 今年4月份发现空间不足,维护人员发现主机上有一个sdb盘(裸盘,而且没有被使用),直接加入到/分区的lv中
3. 前几天系统突然故障,数据库无法连接,他们排查原因的时候发现备份一体机的备份相关的配置和以前设置不一样了,以为故障和这个相关,然后他们就让备份一体机厂商把备份相关配置还原恢复,结果这个操作导致两个问题:1)备份一体机中所有的关于这个主机上的备份文件全部被删除;2)以前在这个主机上看到的sdb的lun也不见了(后来确认是备份一体机映射出来的,现在被回收回去了)
4. 由于调整一体机相关设置之后,依旧无法解决问题,他们开始 怀疑是raid磁盘问题(可能这个时候也发现了raid上面有告警),然后多次尝试对两个盘进行插拔操作,最后导致raid也异常
5. 客户的备份机制:先备份在本地的/分区(也就是说备份文件很可能部分写入到了sdb盘),然后再传输到备份一体机中.
恢复思路
1. 镜像损坏的raid磁盘
2. 通过损坏的磁盘中恢复出来可以恢复的数据文件
3. 通过碎片扫描磁盘,把由于元数据丢失导致部分在镜像磁盘中的数据块恢复出来
4. 通过提取镜像磁盘中的备份,并尽可能的恢复出来需要的业务数据块(基于客户这边的情况,备份是最近写的,大概率是在sdb盘上面占比大,所以直接可以还原的概率很小)
5. 通过工具把3和4中提取出来的block,整合到2中的数据文件中
6. 然后打开数据导出数据(设置跳过坏块)
具体恢复操作
1. 恢复损坏磁盘中的数据文件
接手这个故障之后,让客户想对raid 1中的其中一块磁盘进行镜像,通过工具分析确认是vg少了一块盘

在拷贝过程中发现部分文件有报错,通过文件系统元数据查看报错数据文件分布元数据信息,确认部分数据段存放在了sdb盘上面

通过对恢复出来的所有数据文件使用obet的dbv功能检测(obet实现对数据文件坏块检测功能),并确认有6个数据文件异常
PS I:\2026年7月31日> Get-Content .\dbv_20260731085210.log | Select-String "filesize_status:NO" -Context 2,0 File #1: I:\20260731-jn\xxxx\system01.dbf (4167680 blocks) - Started: 2026-07-31 08:52:10> File #1: rfile=1 (0x00000001) header_block_num=4175360 (0x003FB600) filesize_status:NO File #2: I:\20260731-jn\xxxx\sysaux01.dbf (2470912 blocks) - Started: 2026-07-31 08:52:44> File #2: rfile=2 (0x00000002) header_block_num=2536960 (0x0026B600) filesize_status:NO File #24: I:\20260731-jn\xxxx\XXX406.DBF (2331648 blocks) - Started: 2026-07-31 08:55:58> File #24: rfile=24 (0x00000018) header_block_num=2522880 (0x00267F00) filesize_status:NO File #25: I:\20260731-jn\xxxx\XXX407.DBF (2292736 blocks) - Started: 2026-07-31 08:56:17> File #25: rfile=25 (0x00000019) header_block_num=2484480 (0x0025E900) filesize_status:NO File #26: I:\20260731-jn\xxxx\XXXX408.DBF (2291712 blocks) - Started: 2026-07-31 08:56:36> File #26: rfile=26 (0x0000001A) header_block_num=2483200 (0x0025E400) filesize_status:NO File #27: I:\20260731-jn\xxxx\sysaux02.dbf (832512 blocks) - Started: 2026-07-31 08:56:55> File #27: rfile=27 (0x0000001B) header_block_num=920832 (0x000E0D00) filesize_status:NO |
这里主要是file 24,25,26涉及业务数据,对于system 大概率是aud$记录,sysaux可以直接忽略.
2. 对镜像盘进行碎片扫描,尽可能多的找数据块
对于异常文件缺少的数据块,先尝试对进行磁盘进行碎片扫描最大限度恢复可以由于文件系统元数据写入到sdb磁盘导致的丢失数据,使用OraScan(Oracle 碎片扫描工具)进行碎片扫描,恢复出来数据文件

4. 使用obet最近开发的merge功能对文件进行整合,类似操作

5. 最终恢复之后效果,所有业务数据块总的只有15149个损坏block(无法找出来)
C:\Users\XFF>grep "File #" C:\Users\XFF\dbv_20260801233813.logFile #24: I:\20260731-jn\xxxx\XXX406.DBF (2522881 blocks) - Started: 2026-08-01 23:38:13File #24: rfile=24 (0x00000018) header_block_num=2522880 (0x00267F00) filesize_status:OK File #24 completed: 0 all zero, 0 soft corrupted, 0 tailchk error, 0 checksum error, 4288 rdba errorFile #25: I:\20260731-jn\xxxx\XXX407.DBF (2484481 blocks) - Started: 2026-08-01 23:39:14File #25: rfile=25 (0x00000019) header_block_num=2484480 (0x0025E900) filesize_status:OK File #25 completed: 0 all zero, 1 soft corrupted, 0 tailchk error, 0 checksum error, 10604 rdba errorFile #26: I:\20260731-jn\xxxx\XXX408.DBF (2483201 blocks) - Started: 2026-08-01 23:40:13File #26: rfile=26 (0x0000001A) header_block_num=2483200 (0x0025E400) filesize_status:OK File #26 completed: 0 all zero, 0 soft corrupted, 0 tailchk error, 0 checksum error, 256 rdba error |
6. 尝试打开数据库过程中遇到还有文件大小不对的问题
SQL> /CREATE CONTROLFILE REUSE DATABASE "XXX" NORESETLOGS FORCE LOGGING NOARCHIVELOG*第 1 行出现错误:ORA-01503: CREATE CONTROLFILE ??ORA-01200: 853727 ????????? 920832 ??????ORA-01110: ???? 27: 'I:\20260731-jn\xxxx\sysaux02.dbf' |
使用obet的extend功能进行处理
OBET> extend file 1File #1: I:\20260731-jn\xxx\sysaux02.dbf BlockSize: 8192 bytes Header Blocks: 920832 (offset 44) Expected Size: 7543463936 bytes ((920832+1)*8192) Actual Size: 6993739776 bytes Status: File is smaller than header record. Extending file by 549724160 bytes with zero-filled padding... Confirm? (Y/yes to proceed): Y Done. File extended to 7543463936 bytes. |
然后打开数据库过程报各种错误处理
SQL> recover database;ORA-10562: Error occurred while applying redo to data block (file# 24, block# 2086190)ORA-10564: tablespace TS_HIS4ORA-01110: ???????? 24: 'I:\20260731-JN\XXXX\XXX406.DBF'ORA-10561: block type 'TRANSACTION MANAGED INDEX BLOCK', data object# 93878ORA-00600: ????????????, ????: [6122], [0], [81963], [0], [], [], [], [], [], [], [], []SQL> recover database until cancel;ORA-00279: 更改 3573202216 (在 生成) 对于线程 1 是必需的指定日志: {<RET>=suggested | filename | AUTO | CANCEL}cancelORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误ORA-01194: 文件 1 需要更多的恢复来保持一致性ORA-01110: 数据文件 1: 'I:\20260731-JN\XXXX\SYSTEM01.DBF'ORA-01112: 未启动介质恢复SQL> alter database open resetlogs ;alter database open resetlogs*第 1 行出现错误:ORA-00603: ORACLE server session terminated by fatal errorORA-00600: internal error code, arguments: [2662], [0], [3573202226], [0],[3573222676], [12583040], [], [], [], [], [], []ORA-00600: internal error code, arguments: [2662], [0], [3573202225], [0],[3573222676], [12583040], [], [], [], [], [], []ORA-01092: ORACLE instance terminated. Disconnection forcedORA-00600: internal error code, arguments: [2662], [0], [3573202223], [0],[3573222676], [12583040], [], [], [], [], [], []进程 ID: 16884会话 ID: 1 序列号: 3 |
通过patch_scn(Patch SCN一键解决ORA-600 2662故障)解决这个问题之后,数据库顺利打开
SQL> alter database open ;alter database open*第 1 行出现错误:ORA-01113: ?? 1 ??????ORA-01110: ???? 1: 'I:\20260731-JN\XXXX\SYSTEM01.DBF'SQL> recover database;完成介质恢复。SQL> alter database open;数据库已更改。 |
然后按照客户需求导出数据,完成本次恢复任务.
浙公网安备 33010602011771号