主库实例重启后MRP卡在WAIT_FOR_GAP,主因是归档链路未就绪(ARCn未启动/归档路径不可写/TNS不通)、FAL_SERVER配置错误(配在主库或别名不可解析)、STANDBY_FILE_MANAGEMENT=AUTO因UNNAMED文件阻塞,而非网络或日志丢失。
主库实例重启后MRP进程卡在“WAIT_FOR_GAP”状态
主库异常宕机再重启,备库mrp(managed recovery process)常直接停摆,v$managed_standby里看到进程状态是 wait_for_gap 或 applying_log 但无实际推进。这不是网络或归档传输中断,而是备库在重做应用层面“不敢动”——它检测到本地缺少某些重做日志序列号,但又无法确认这些日志是否真丢失、还是主库还没来得及生成或传送。
- 主库实例崩溃时,可能有未写入归档的在线重做日志(online redo log),这部分内容不会自动补传到备库
- 重启后主库会做实例恢复(instance recovery),但这个过程只在本地完成,不触发重做日志重传
- 备库MRP在应用完已收到的日志后,发现下一个需要的sequence#在
V$ARCHIVE_GAP中显示为缺失,于是挂起等待 - 此时FAL_SERVER机制不会自动触发补缺,因为FAL请求依赖主库已归档且
LOG_ARCHIVE_DEST_n处于ENABLE+VALID状态,而刚重启时归档路径权限、监听、TNS连通性可能尚未就绪
备库报ORA-16038 / ORA-19502这类I/O错误的真正原因
你看到ORA-16038: log 5 sequence# 12345 cannot be archived 或 ORA-19502: write error on file ... block number 12345,大概率不是磁盘坏了,而是主库重启后归档进程(ARCn)没能及时拉起,或者归档目标路径不可写(比如NFS挂载延迟、ASM diskgroup未mount、目录权限被重置)。
- 检查主库:
SELECT DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST WHERE DEST_ID = 2;—— 若STATUS是ERROR或INACTIVE,说明归档链路本身没活过来 - 别只信
ARCHIVE LOG LIST,用ls -ld和touch test.arc实测归档路径是否可写 - tnsping备库TNS别名(不是IP)必须通,否则FAL_CLIENT发不出补缺请求
- 主库alert.log里搜
ARC.*started和Archived Log entry,确认ARCn进程真实工作了
STANDBY_FILE_MANAGEMENT=AUTO失效导致UNNAMED文件阻塞同步
主库重启前刚新增了表空间,备库因磁盘空间不足或路径转换失败,STANDBY_FILE_MANAGEMENT=AUTO创建数据文件失败,留下UNNAMED00xxx占位符。MRP一碰到这个文件就会停住,报ORA-16136: Managed Standby Recovery not active或FILE MISSING,而不是继续往后应用日志。
- 查备库:
SELECT NAME FROM V$DATAFILE WHERE NAME LIKE '%UNNAMED%'; - 确认
DB_FILE_NAME_CONVERT是否配置正确,且目标路径真实存在、有足够空间、Oracle用户有写权限 - 若已存在UNNAMED文件,不能直接删,需先
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL,再手动创建对应数据文件,最后重启MRP - 临时规避:设
STANDBY_FILE_MANAGEMENT=MANUAL(需重启实例),但后续新增文件必须手工处理
FAL_SERVER配置错位导致“有gap却无人响应”
FAL_SERVER值必须是备库能解析的TNS别名,且该别名定义在**备库**的$ORACLE_HOME/network/admin/tnsnames.ora中——不是主库的。很多DBA配反了,结果备库检测到gap后发FAL请求,目标根本不存在,日志里只看到FAL[client]: Failed to request gap sequence,却找不到原因。
- 在备库执行:
tnsping <your_fal_server_value>,必须成功 - 检查备库tnsnames.ora中该别名是否指向主库,且
(CONNECT_DATA=(SERVICE_NAME=...))匹配主库实际服务名 -
FAL_CLIENT参数也要在备库设置,值为备库自己的DB_UNIQUE_NAME,用于主库回传时标识来源 - 主库端不需要配
FAL_SERVER,那是备库才用的参数
关键点在于:实例重启本身不破坏DG配置,但它暴露的是那些平时“凑合能用”的脆弱环节——归档路径权限、TNS连通性、文件路径转换、FAL配置位置。一次闪断就像压力测试,把所有没验证过的假设都打回原形。

















