必须先执行ADVISE FAILURE再REPAIR FAILURE,因LIST FAILURE仅发现故障,ADVISE FAILURE才分析v$datafile等元数据生成准确修复方案,跳过会导致RMAN误判并生成错误RESTORE指令。

直接用 REPAIR FAILURE 命令就能生成并执行修复脚本,但前提是必须先 ADVISE FAILURE,且不能跳过诊断环节——跳过会导致 RMAN 误判文件状态,反而生成错误的 RESTORE 指令。
为什么 list failure 后不能直接 repair
RMAN 的故障诊断是分阶段的:先发现(LIST FAILURE),再分析(ADVISE FAILURE),最后修复(REPAIR FAILURE)。跳过 ADVISE 直接 REPAIR 会触发默认策略,比如对疑似丢失的 datafile 一律走 RESTORE DATAFILE n,而实际可能只是控制文件未同步或路径映射未生效。
-
LIST FAILURE只列出“什么坏了”,不判断“怎么修” -
ADVISE FAILURE才真正读取v$datafile、v$database_block_corruption和备份元数据,输出可选方案(含是否需要SET NEWNAME) -
REPAIR FAILURE默认执行ADVISE给出的 *第一个* 方案;若你没看建议就运行,可能覆盖掉更稳妥的手动恢复路径
ADVISE FAILURE 输出里藏着关键修复逻辑
执行 ADVISE FAILURE 后,RMAN 会打印类似这样的建议:
Strategy: The repair includes the following steps: 1. Restore datafile 13 from backup 2. Switch datafile 13 to copy 3. Recover datafile 13
注意:它不会自动写 SET NEWNAME,也不会处理 tempfile 或归档路径错位。这些必须人工补全到最终脚本里。
- 如果建议里出现 “Switch datafile X to copy”,说明目标机上已有镜像副本,此时
RESTORE步骤可跳过,只做SWITCH+RECOVER - 如果建议里没提 tempfile,但
v$tempfile查出有临时文件路径不一致,必须额外加SET NEWNAME FOR TEMPFILE - 若提示 “Recover using archived logs from LOCATION …”,而目标机该路径不存在,得提前
mkdir -p或改log_archive_dest_1
怎样把诊断结果转成可执行的 RMAN 脚本
不能靠复制粘贴 ADVISE 输出——它只是自然语言描述。真正要跑的脚本,得按 RUN 块结构手写,且所有 SET NEWNAME 必须和 RESTORE 放在同一个 run { } 里。
- 先从
v$datafile动态生成SET NEWNAME语句(别手写),确保 file# 严格对齐 - tempfile 单独查
v$tempfile,用SET NEWNAME FOR TEMPFILE,别混进 datafile 查询里 -
RESTORE DATABASE和RECOVER DATABASE必须在同一个run { }内,否则SWITCH DATAFILE ALL不生效 - Windows 路径里的反斜杠必须写成双份:
'D:\oradata\system01.dbf',单份会被 RMAN 当转义符吃掉
容易被忽略的三件事
诊断报告再准,脚本执行失败往往卡在这三点:
- 控制文件里记录的
name字段还是旧路径,SWITCH DATAFILE ALL只改内存视图,不改控制文件物理内容——所以必须跟ALTER DATABASE OPEN RESETLOGS配合,否则下次启动仍报ORA-01157 -
REPAIR FAILURE不处理归档日志路径不一致问题,它只管 datafile;归档路径错位得手动干预log_archive_dest_1或建目录 - 异机恢复时,
v$database的dbid和源库一致,但control_files参数若没在 pfile/spfile 里显式重设,RMAN 会尝试去读旧路径下的控制文件,直接报RMAN-06171


















