必须先确认MRP已停止、无归档GAP且备库为MOUNT状态,再清理归档和SRL文件,用主库生成的standby控制文件覆盖后启动MRP;否则易报ORA-16766、ORA-16055等错误。

确认当前DG状态并停止所有同步进程
直接删文件或停库前,必须先确认MRP进程已真正停止、无GAP、且备库处于MOUNT状态。否则后续重建会卡在ORA-16766: recovery is suspended或ORA-16055: FAL request rejected。执行以下检查:
- 查
v$archive_gap:结果应为空;不为空说明有未传输日志,不能删 - 查
v$managed_standby:确认PROCESS = 'MRP0'且STATUS = 'WAIT_FOR_LOG'或NOT APPLYING;若为APPLYING,先执行ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; - 查
v$database.open_mode:备库必须是MOUNTED,不是READ ONLY WITH APPLY(Active DG场景) - 主库上查
SELECT DESTINATION, STATUS, ERROR FROM v$archive_dest WHERE DEST_ID IN (2);,确保STATUS = 'VALID'且ERROR为空
清理物理归档与Standby Redo Log文件
归档和SRL文件不清理干净,重建时会因文件冲突报ORA-19504: failed to create file或ORA-01119: error in creating database file。注意:不能只删log_archive_dest_n路径下的归档,还要清SRL——它们不在归档目录里,而是在db_create_file_dest或显式指定路径中。
- 在备库操作系统层执行:
find /u01/app/oracle/oradata/data/ -name "stan*.log" -delete(路径按实际v$logfile中TYPE = 'STANDBY'的MEMBER列调整) - 清归档:
find /u01/app/oracle/oradata/data/archive/ -name "*.arc" -mtime +1 -delete(加-mtime +1防误删刚接收但尚未应用的日志) - 检查
v$standby_log是否为空;若非空,先在SQL*Plus中执行ALTER DATABASE DROP STANDBY LOGFILE GROUP 4;等逐个删除(注意GROUP号顺序) - 删完后运行
RMAN TARGET /→CROSSCHECK ARCHIVELOG ALL;→DELETE EXPIRED ARCHIVELOG ALL;,清除控制文件中残留元数据
重置控制文件并重建备库基础结构
用主库生成的新standby控制文件覆盖旧文件,是重建最安全的方式。不能直接复制主库在线控制文件,也不能用CREATE CONTROLFILE手工建——11g下极易因RESETLOGS或SCN不一致导致ORA-01152: file %s was not restored from a backup。
- 主库执行:
ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/tmp/standby.ctl'; - 将
/tmp/standby.ctlscp 到备库对应control_files参数路径(如/u01/app/oracle/oradata/data/control01.ctl),并覆盖原文件 - 备库启动到MOUNT:
STARTUP MOUNT;;此时SELECT NAME, OPEN_MODE FROM V$DATABASE;应返回MOUNTED - 验证控制文件有效性:
RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;若立即报错,大概率是控制文件没覆盖全或路径不匹配;检查v$controlfile中所有路径是否存在且可写
重新启用日志传输与应用,跳过RMAN Duplicate
如果只是清理配置而非重搭整库,没必要走RMAN DUPLICATE——它耗时长、占空间、还可能因主库备份过期失败。只要控制文件新、归档链完整、网络通,MRP就能从最近一个可用归档续上。
- 主库检查
LOG_ARCHIVE_DEST_2是否启用:ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE; - 主库切一次日志:
ALTER SYSTEM SWITCH LOGFILE;,观察备库ALERT.log是否收到RFS[?]: Selected log ? for thread ? sequence ? - 备库启动MRP:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; - 1分钟后查
v$managed_standby:若PROCESS = 'MRP0'且SEQ#持续增长,说明已活;若卡在WAIT_FOR_GAP,回到第一步查v$archive_gap
最关键的遗漏点:很多人删完归档就以为万事大吉,却忘了control_file_record_keep_time默认7天——超过这个时间的归档记录即使物理文件还在,RMAN也看不见,MRP也不会去读。所以重建后首次RECOVER若报找不到某sequence,不是配置错了,而是那部分归档早已被OS层清理掉,只能靠主库补传或重新做一次基础备份。











