必须显式执行REMOVE DATABASE和REMOVE CONFIGURATION来清除Data Guard Broker残留配置,否则重新创建同名配置时通常会报ORA-16623/ORA-16603;同时还需要一并清理LOG_ARCHIVE_DEST_n参数以及“失联归档”物理文件。

备库配置已停用但DG Broker仍残留怎么办
Oracle Data Guard Broker 配置不会随着数据库关闭、备库停用或主备角色切换而自动删除。若停用备库后没有显式清理,dg_broker_config_file1 和 dg_broker_config_file2 中仍会保留旧的路径、监听信息以及状态元数据。这样在后续重建相同名称的配置时,往往会触发 ORA-16623 或 ORA-16603 错误。因此,必须先从 Broker 中彻底移除旧配置,否则 DGMGRL 无法正常注册新的 Data Guard 配置。
操作前请先确认:DGMGRL 已连接到当前主库(不是原备库),并且该 Broker 配置当前处于 DISABLED 状态:
SHOW CONFIGURATION VERBOSE;
如果显示为 DISABLED,且状态为 WARNING 或 FAILURE,通常说明该配置已经失效,但残留信息尚未清除。可按以下步骤处理:
- 在
DGMGRL中执行REMOVE DATABASE 'db_unique_name_of_standby';—— 这里填写的是原备库的db_unique_name,不是实例名 - 随后执行
REMOVE CONFIGURATION;,该命令会清空整个 Broker 配置,包括主库对应条目 - 检查 $ORACLE_HOME/dbs/ 目录下两个 Broker 配置文件是否已被自动重命名(例如增加
.old后缀);如果仍然存在,则手动rm删除 - 重启主库监听器和数据库实例,确保 Broker 相关后台进程(DMON)已经完全退出
删完 Broker 配置后,归档目录和控制文件记录还在
清理 Broker 配置只会影响 Broker 元数据,并不会自动删除物理归档文件,也不会立即清除控制文件中的归档记录。对于已经停用的备库,如果此前接收过归档日志,那么其 v$archived_log 中仍可能保留大量与 DEST_ID 对应的已应用记录。这些记录会按照 control_file_record_keep_time(默认7天)继续保留。不过一旦超过保留期,相关元数据会从控制文件中消失,此时 RMAN 将无法再识别这些物理文件,它们就会变成常说的“失联归档”。遇到这种情况,只能通过 find /path/to/arch -name "*.dbf" -mtime +15 -delete 这类命令进行清理。
关键注意点:
- 不要直接执行
rm -f *.dbf,应先查询v$archive_dest,确认对应DEST_ID是否仍然指向该目录;如果已没有对应 DEST,通常说明该路径已经废弃 - 在执行
find清理命令前,务必确认当前没有备份任务(例如第三方备份工具)正在扫描该目录,否则可能导致备份作业中断 -mtime +15属于更稳妥的安全缓冲值,相比SYSDATE - 7额外多保留 8 天,可避免归档刚失效就被提前删除
RAC 环境下删备库配置要额外注意节点一致性
在 RAC 主库环境中删除 Broker 配置时,DGMGRL 默认只对当前连接的节点生效。若未同步处理所有实例,其他节点在重启后仍可能重新加载旧的 Broker 文件,从而导致 DMON 进程异常启动,并出现 ORA-16826 错误。
因此必须额外完成以下几项检查与操作:
- 所有 RAC 节点都要执行一次
REMOVE CONFIGURATION;,不能只在单个节点上处理 - 检查每个节点的
$ORACLE_HOME/dbs目录,确认dr1*.dat和dr2*.dat文件都已经被清除或重命名 - 修改
init.ora或 SPFILE 中的dg_broker_start=FALSE,防止实例重启后自动拉起 DMON
删完配置却收不到主库归档?检查 LOG_ARCHIVE_DEST_n 是否残留
即使 Broker 配置已经删除,主库中的LOG_ARCHIVE_DEST_2(或更高编号的归档目标)也可能仍保留着已经停用的备库地址,例如SERVICE=old_stby LGWR SYNC AFFIRM。这类残留参数会让主库持续尝试传输归档日志,一旦传输失败,就会不断在ALERT.log中写入报错信息,严重时甚至可能导致LNS进程卡住。
排查与清理方法如下:
- 在主库执行
SELECT dest_id, status, destination FROM v$archive_dest WHERE dest_id > 1;,找出仍指向已停用备库的dest_id - 执行
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='' SCOPE=BOTH;(根据实际dest_id替换编号) - 立即触发一次日志切换:
ALTER SYSTEM SWITCH LOGFILE;,并观察v$archive_dest_status中对应项是否已经变为INACTIVE - 最后执行
ALTER SYSTEM ARCHIVE LOG CURRENT;,确保当前日志已完成归档,以验证归档传输链路确实已经断开
最容易被忽略的问题是:Broker 配置虽然删掉了,但 LOG_ARCHIVE_DEST_n 没有同步清理,导致主库仍在向废弃备库发送归档;或者在使用 find 清理归档文件时,没有先核对 DEST_ID 是否已经失效,结果误删了其他备库仍在使用的归档路径。
