ORA-16792和MRP挂起通常非DG故障,而是RAC节点宕机后集群服务状态未同步更新所致;需先检查crsctl资源状态(尤其ora.net1.network)、监听注册、归档生成及Broker元数据一致性。
ORA-16792 和 MRP 进程挂起:先确认是不是真故障
rac节点宕机后,dg备库出现归档传输中断、mrp卡住、ora-16792(“configuration is inconsistent”)报错,不等于dg本身坏了——大概率是主库集群服务状态没同步更新,导致data guard broker或底层log_archive_dest_n参数仍尝试向已离线的节点发日志。
先别急着重启MRP或改参数。用crsctl status res -t在主库存活节点上检查:ora.LISTENER_SCAN1.lsnr、ora.<node_name>.vip</node_name>、ora.<db_unique_name>.db</db_unique_name>是否全为ONLINE;特别注意ora.net1.network和ora.asm是否异常。如果ora.net1.network没起来,监听注册失败,DG根本收不到归档,所有后续操作都是徒劳。
- 查
v$archive_dest_status里STATUS列,看LOG_ARCHIVE_DEST_2是否显示ERROR,并留意ERROR字段内容(常含TNS连接超时或ORA-12541) - 执行
tnsping <standby_tns_alias></standby_tns_alias>验证网络连通性,但必须在grid用户下运行(避免环境变量污染) - 确认主库
log_archive_dest_2指向的是SCAN名(如SERVICE=adgdg),而非某个具体节点VIP(如HOST=node1-vip)——后者在节点宕机后必然失败
主库监听未注册到集群资源:手动触发注册无效?试试强制重载
即使lsnrctl status显示监听运行正常,若crsctl status res ora.LISTENER.lsnr显示OFFLINE或INTERMEDIATE,说明Clusterware没真正接管它。此时手工执行alter system register基本无效,因为实例根本没注册进集群监听资源树。
正确做法是让CRS重新加载监听配置:
- 先停掉手动启的监听:
lsnrctl stop(确保非CRS托管) - 用
crsctl start res ora.LISTENER.lsnr启动——如果报依赖ora.net1.network失败,必须先crsctl start res ora.net1.network - 启动成功后,立刻检查
srvctl config listener输出是否包含正确的Endpoints,再确认lsnrctl services里是否有主库实例名(如orcl1、orcl2)注册进来 - 若仍无注册,检查主库参数
local_listener是否指向(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<scan_ip>)(PORT=1521)))</scan_ip>,而不是某节点私网IP
备库MRP无法启动:别只盯着归档路径,先看主库归档是否真生成
MRP卡在Waiting for archive log,常见误区是猛查备库LOG_ARCHIVE_DEST_1路径权限或磁盘空间。实际上,问题根源常在主库:节点故障后,ASM磁盘组可能因投票盘丢失进入DISMOUNTED状态,导致+DATA下的归档目录不可写,主库压根没产生新归档。
在主库存活节点上快速验证:
- 执行
asmcmd lsdg,确认STATE列为MOUNTED,且USABLE_FILE_MB > 0 - 查
v$recovery_file_dest,看SPACE_LIMIT和SPACE_USED是否接近100% - 运行
select max(sequence#) from v$archived_log where dest_id=1,对比select sequence#, first_time, next_time from v$log_history where rownum——若前者远小于后者,说明归档根本没落盘 - 临时切换归档目标到本地文件系统测试:
alter system set log_archive_dest_1='LOCATION=/tmp/arch' scope=both,再切回ASM前确认路径可写
节点恢复后DG状态仍不一致:Broker配置需手动同步
RAC节点重启、CRS拉起、数据库实例上线后,DG Broker不会自动感知主库拓扑变化。你可能看到DGMGRL> show configuration仍报Warning: ORA-16607,或show database verbose <db_name></db_name>里Intended State还是ORACLE MAINTENANCE。
必须显式刷新Broker元数据:
- 在主库任一节点执行:
dgmgrl / "edit database '<primary_db>' set property 'StaticConnectIdentifier'='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<scan_name>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<db_unique_name>_DGMGRL)))';</db_unique_name></scan_name></primary_db> - 然后
enable configuration,再show configuration确认状态变为SUCCESS - 如果之前手动改过
log_archive_dest_2,记得用edit database '<primary_db>' set property 'LogXptMode'='SYNC'</primary_db>等命令对齐Broker属性,否则Broker会持续覆盖你的手动设置
最关键的细节往往藏在ora.net1.network这种依赖服务里——它不起,整个通信链就断在第一环,所有上层诊断都像在修一辆没油的车。











