RMAN RECOVER STANDBY DATABASE FROM SERVICE仅拉取并应用缺失归档日志、推进SCN,不还原数据文件或重建控制文件,依赖主库存活、网络通畅及备库控制文件完好;若主库不可达或控制文件损坏,则必须转为RMAN异机恢复流程。

DG备库恢复不是“无缝”的,RMAN能做的只是补断档归档,前提是主库还活着、网络通、且备库控制文件没损坏;一旦控制文件丢失或主库不可达,就必须走异机恢复流程,那根本谈不上无缝。
RMAN RECOVER STANDBY DATABASE FROM SERVICE 本质是拉日志
这个命令不还原数据文件,也不重建控制文件,它只做三件事:从主库拉缺失的归档日志、应用到备库、推进SCN。执行时实际走的是主库的ARCH进程+网络传输,不是本地磁盘读备份片。
- 必须确保主库
LOG_ARCHIVE_DEST_n中至少一个目标配置了SYNC或ASYNC且VALID_FOR=(ONLINE_LOGFILE,PRIMARY_ROLE) - 备库监听必须能连通主库服务名(比如
orcl),tnsnames.ora里不能只写IP不写端口和服务名 - 如果主库刚切归档但还没传到备库,
RECOVER STANDBY DATABASE FROM SERVICE会等超时(默认180秒),报错ORA-16724: unable to determine the current standby database role,此时要先确认V$DATABASE.DATABASE_ROLE = 'PHYSICAL STANDBY'
断档识别必须用 V$ARCHIVE_GAP,别信 LIST ARCHIVELOG
LIST ARCHIVELOG ALL只显示控制文件里已注册的日志,而断档意味着这些日志根本没进控制文件——所以它可能返回空,但V$ARCHIVE_GAP才是唯一可信来源。
- 执行前先停日志应用:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 查出
THREAD#、LOW_SEQUENCE#、HIGH_SEQUENCE#后,手动在主库归档目录下确认文件是否存在:ls -l $ORACLE_BASE/fast_recovery_area/ORCL/archivelog/2026_08_27/thread_1_seq_12345.* - 如果主库归档被
DELETE INPUT删了,RMAN不会自动去备份集中捞,它只会报ORA-19505: failed to identify a file,这时就得切到RMAN异机恢复模式
RECOVER FROM SERVICE 后必须手动 STARTUP MOUNT + ALTER DATABASE RECOVER
命令执行完控制文件仍是MOUNT状态,且日志应用没开,很多人卡在这一步以为“恢复完了”,其实备库还处于静默状态。
- 执行完
RECOVER STANDBY DATABASE FROM SERVICE orcl后,立刻检查SELECT status, database_role FROM v$database;,应为MOUNTED+PHYSICAL STANDBY - 必须再执行:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; - 如果之前改过
db_unique_name或log_archive_config,这里会报ORA-16664: unable to receive the result from a database,得先在主备两端同步LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,orcldg)'
真正容易被忽略的是:RMAN在DG场景下根本不碰数据文件路径映射。它假设你已经用DB_FILE_NAME_CONVERT和LOG_FILE_NAME_CONVERT在备库spfile里配好了所有路径重写规则。一旦这些参数漏配或写反,RECOVER FROM SERVICE成功后,日志能拉过来,但应用时报ORA-01111: name for data file X is unknown——错误不在RMAN,而在初始化参数。


















