物理备库rman备份前须停用实时应用并启动到mount状态,使用backup current controlfile for standby生成控制文件,还原时用restore standby controlfile;恢复后需清理srl、重置log_archive_dest_2,并执行convert to primary后open resetlogs。
物理备库上执行 rman 备份前必须停用实时应用
物理备库默认处于 managed recovery 状态,此时数据文件被 recovery 进程独占锁定,backup database 会直接报错 ora-01157: cannot identify/lock data file。不是权限问题,是 oracle 底层机制限制。
- 先确认状态:
SELECT database_role, open_mode, recovery_status FROM v$database;—— 必须看到PHYSICAL STANDBY+MOUNTED+NOT ACTIVE - 停止应用:执行
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;,再SHUTDOWN IMMEDIATE; STARTUP MOUNT; - 切记不要用
OPEN READ ONLY后备份——RMAN 不允许对只读打开的备库做全库备份(会报ORA-19602: no backup of read-only files allowed)
RMAN 恢复到新主机时 CONTROLFILE 必须用 BACKUP CURRENT CONTROLFILE
从物理备库拉取的控制文件备份(BACKUP CURRENT CONTROLFILE)和主库生成的不一样:它自带 Standby 控制文件头信息、已知的归档路径映射、以及 STANDBY_FILE_MANAGEMENT=AUTO 等参数痕迹。直接拷贝生产库控制文件会导致恢复中途报 ORA-01180: can not create datafile 1。
- 在备库 mount 状态下运行:
BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/tmp/standby_cf.bkp'; - 还原时用
RESTORE STANDBY CONTROLFILE FROM '/tmp/standby_cf.bkp';,不是RESTORE CONTROLFILE - 如果新环境要转为主库,后续必须运行
ALTER DATABASE CONVERT TO PRIMARY DATABASE;,不能跳过
恢复后 OPEN RESETLOGS 前必须清理旧的 Standby Redo Logs
物理备库的 SRL 文件(STANDBY REDO LOG)在新环境里毫无意义,且残留会干扰 OPEN RESETLOGS:Oracle 可能尝试重用它们,触发 ORA-00313: open failed for members of log group 或导致实例挂起。
- 在 mount 状态下,先查出所有 SRL:
SELECT group#, type, member FROM v$logfile WHERE type = 'STANDBY'; - 逐个 drop:
ALTER DATABASE DROP STANDBY LOGFILE GROUP 4;(替换为实际 group#) - 确认清空:
SELECT * FROM v$standby_log;应返回空集,再执行ALTER DATABASE OPEN RESETLOGS;
归档日志路径不一致时用 SET ARCHIVELOG DESTINATION 最省事
新主机磁盘结构不同,原备库归档路径(如 /arch/PROD/)很可能不存在或不可写。RMAN 默认按控制文件里记录的路径找归档,找不到就卡住或报 ORA-19505: failed to identify file。
- 在 RUN 块里显式指定新位置:
SET ARCHIVELOG DESTINATION TO '/u01/arch_new'; - 别依赖
CONFIGURE ARCHIVELOG DELETION POLICY——那是删归档用的,不影响恢复时查找路径 - 如果归档分散在多个目录,得用
CATALOG START WITH先注册,但滚动升级场景通常提前集中拷贝更可控
真正麻烦的是控制文件里硬编码的备用归档目标(log_archive_dest_2),如果没清理干净,实例启动后可能自动发起无效的归档传输,浪费网络和 CPU。这点常被忽略,得进 SQL*Plus 手动 ALTER SYSTEM RESET log_archive_dest_2 SCOPE=SPFILE; 再重启。










