能恢复,但必须分清磁盘损坏影响的是asm磁盘组、文件系统设备还是单个数据文件:三者路径不同,混用命令将导致ora-01157或ora-00205;需先查asm状态,再按asm修复、rman路径匹配、归档连续性验证、system整库恢复四步操作。
能恢复,但必须分清“磁盘损坏”具体影响哪一层:是asm磁盘组成员失效、文件系统级设备不可用,还是仅单个数据文件物理损坏。三者恢复路径完全不同,混用命令会直接导致ora-01157或ora-00205。
确认磁盘损坏是否已导致ASM磁盘组DEGRADED或OFFLINE
如果数据库用ASM管理,先别急着启库。直接连上ASM实例查状态:
sqlplus / as sysasm SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup;
若state为DEGRADED或OFFLINE,说明底层磁盘I/O异常已传导至ASM层。此时不能直接RESTORE DATAFILE——RMAN找不到可用的ASM磁盘路径。必须先修复ASM层面:
- 用
ALTER DISKGROUP ... DROP DISK踢掉故障磁盘(注意:必须有冗余策略,如NORMAL或HIGH) - 用
ALTER DISKGROUP ... ADD DISK加入新磁盘并触发REBALANCE - 等
v$asm_operation中STATE变为COMPLETED后再继续RMAN操作
跳过这步强行恢复,RMAN会报ORA-15012: ASM disk does not exist,且可能把剩余好盘也拖进不稳定状态。
RMAN RESTORE DATAFILE时路径必须匹配ASM别名或文件系统绝对路径
很多人在ASM环境里写RESTORE DATAFILE 4;后发现还原出来的文件名是+DATA/orcl/datafile/users.256.123456789,但控制文件里记录的是/u01/oradata/orcl/users01.dbf,结果RECOVER阶段立刻报ORA-01122和ORA-01110。
正确做法是显式指定目标位置:
- 如果是ASM:先查该文件当前ASM别名:
SELECT name FROM v$datafile WHERE file# = 4;,然后在RMAN中SET NEWNAME FOR DATAFILE 4 TO '+DATA'; - 如果是文件系统:确保
SET NEWNAME指向的目录存在、权限正确(oracle用户可写)、空间足够,且SWITCH DATAFILE ALL必须执行,否则控制文件仍指向旧路径
漏掉SWITCH是ALTER DATABASE DATAFILE 4 ONLINE失败的最常见原因。
磁盘替换后必须验证归档日志连续性,否则RECOVER必然中断
物理磁盘损坏常伴随归档日志丢失——尤其当归档路径就在坏盘上。即使RMAN能成功RESTORE数据文件,RECOVER阶段也会卡在第一个缺失的归档序列号,报ORA-00308或ORA-19505。
必须人工核对归档链是否完整:
- 运行
LIST ARCHIVELOG FROM SCN <min_scn_of_backup>;</min_scn_of_backup>(min_scn_of_backup从LIST BACKUP OF DATABASE输出里找) - 对比输出中的
SEQUENCE#是否连续,中间缺号就说明归档断档 - 若断档,只能做不完全恢复到断档前最后一个可用归档,用
RECOVER DATABASE UNTIL SEQUENCE <n></n>,之后ALTER DATABASE OPEN RESETLOGS
这个检查步骤无法跳过,也没有自动补全机制。依赖备份策略里归档是否异地保存。
SYSTEM表空间损坏时不能只恢复单个数据文件
如果坏盘上恰好存着SYSTEM表空间的数据文件(比如system01.dbf),不要尝试RESTORE DATAFILE 1后直接RECOVER——大概率触发ORA-00600 [kcratr_nab_less_than_odr]内核错误,甚至让整个实例无法MOUNT。
根本原因是SYSTEM包含数据字典,其一致性依赖所有其他表空间头块和SCN同步。稳妥做法只有两个:
- 用
RESTORE DATABASE+RECOVER DATABASE整库恢复(前提是控制文件完好、归档连续) - 若控制文件也损坏,必须先用
RESTORE CONTROLFILE FROM AUTOBACKUP,再STARTUP MOUNT,最后整库恢复
试图绕过SYSTEM单独修它,等于在没地基时重装承重墙——表面能OPEN,实际一查dba_objects就报错。











