全库恢复必须先停库至mount状态,因oracle内核禁止在open状态下覆盖dbwn正在刷写的文件;restore database会失败或挂起,报rman-06023;需确认select status from v$instance返回mounted,且restore与recover必须成对执行,缺一不可。

全库恢复必须先停库到MOUNT状态
Oracle内核禁止在OPEN状态下覆盖正在被DBWn刷写的文件,RESTORE DATABASE会直接失败或挂起。看到RMAN-06023报错别急着查备份是否存在——大概率是实例状态不对。执行前必须确认:SELECT status FROM v$instance;返回MOUNTED,而不是OPEN。
常见错误操作包括:用户表空间文件丢失后仍强行OPEN、用ALTER DATABASE DATAFILE ... OFFLINE DROP清空控制文件记录、或误以为“归档日志够多就能跳过MOUNT”。这些都会导致后续RECOVER找不到目标文件或SCN无法对齐。
- 系统表空间(如SYSTEM)损坏时,实例通常已自动宕机,直接
STARTUP MOUNT即可 - 用户表空间损坏后实例仍在运行,但访问对应对象会报
ORA-01116,此时必须人工SHUTDOWN IMMEDIATE再STARTUP MOUNT - Windows下路径用反斜杠
\,Linux/macOS必须用正斜杠/,v$datafile里怎么写,还原路径就得一模一样
RESTORE和RECOVER必须成对执行
RESTORE DATABASE只是把备份片解压拷贝到磁盘,得到的是“冷副本”,其数据块SCN滞后于当前控制文件;RECOVER DATABASE才真正应用归档日志前滚,修复一致性。跳过后者直接ALTER DATABASE OPEN RESETLOGS,必然触发ORA-01113。
归档日志缺失时,RECOVER不会报错,而是静默停在第一个断档点。务必提前验证:SELECT MIN(FIRST_TIME), MAX(NEXT_TIME) FROM v$archived_log;是否覆盖还原点之后的时间范围。
- 若归档分散在多个目录,需在RMAN中执行
SET ARCHIVELOG DESTINATION TO '/path'指定搜索路径 - 使用
RECOVER DATABASE UNTIL TIME或UNTIL SCN做不完全恢复时,必须确保该时间点前的所有归档都已注册进控制文件 - 恢复完成后、
OPEN RESETLOGS前,检查v$datafile_header.CHECKPOINT_CHANGE#与v$datafile.CHECKPOINT_CHANGE#是否一致,不一致说明RECOVER未走完
异机恢复要手动处理三处硬断点
源库和目标机的目录结构、ASM配置、甚至DB_NAME大小写不同,都会让RESTORE DATABASE找不到路径。RMAN不会自动适配新环境,它只认备份集里记录的原始路径。
典型报错:ORA-01157(路径不存在)、RMAN-06023(备份片不可访问)、ORA-01110(控制文件还记着旧路径)。核心解法是用SET NEWNAME显式重定向。
- 先在源库查真实路径:
SELECT FILE#, NAME FROM V$DATAFILE; - 在RMAN中逐个设置:
SET NEWNAME FOR DATAFILE 1 TO '/u01/oradata/NEWDB/system01.dbf'; - 执行
SWITCH DATAFILE ALL;更新控制文件里的路径记录——这步不能省 - 控制文件路径、
db_recovery_file_dest、diagnostic_dest等参数必须手工修改并建好对应目录,chown oracle:oinstall -R权限缺一不可
恢复后ONLINE前必须校验两件事
文件权限不对或路径被手动改名,是ALTER DATABASE DATAFILE ... ONLINE失败的最常见原因。报ORA-01157不是RMAN没还原成功,而是Oracle进程根本读不到那个文件。
尤其注意:如果误删后有人重建了同名空文件,RMAN还原会失败;如果路径下存在users01.dbf.bak,而控制文件仍指向users01.dbf,就会卡在ORA-01110。
- 执行
ls -l /u01/oradata/NEWDB/system01.dbf确认文件存在、大小非零、属主为oracle:oinstall - 检查文件名是否被重命名过,比如加了
.bak或.old后缀 - 若路径指向
MISSING00005,说明控制文件未登记该文件,需先补进或用CREATE DATAFILE重建
RECOVER阶段对归档日志链完整性的静默依赖——它不报错,但也不推进。一旦卡住,得立刻查v$archived_log和LIST ARCHIVELOG ALL比对时间范围,而不是反复重试RESTORE。











