dg broker安全重启需三步闭环:先设dg_broker_start=false scope=both终止dmon,再确保_dgmgrl服务静态注册并重载监听,最后设true scope=both并查drc.trc验证。

不能直接 kill dmon 进程或删 .dat 文件来“重启”DG Broker —— 这会导致 ORA-16603、ORA-16748 等配置不一致错误,甚至让 switchover 失败。
dg_broker_start 必须设为 FALSE 再设回 TRUE
Broker 不是传统服务,没有 start/stop 命令;它的启停完全依赖 dg_broker_start 参数。设为 FALSE 会终止 dmon 进程并释放配置锁,设回 TRUE 才真正加载配置。
- 在每个数据库实例上执行:
ALTER SYSTEM SET dg_broker_start=FALSE SCOPE=BOTH; - 确认进程已退出:
ps -ef | grep dmon应无输出(RAC 要查所有节点) - 再执行:
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=BOTH; - RAC 环境下,必须确保所有实例的
dg_broker_start值一致,用SELECT INST_ID, VALUE FROM GV$PARAMETER WHERE NAME = 'dg_broker_start';验证
重载前必须检查监听器是否注册了 _DGMGRL 服务
Broker 启动时会尝试连接主库和备库,连接目标是 DB_UNIQUE_NAME_DGMGRL 这个服务名。如果监听器没静态注册它,dmon 会卡住或报 ORA-16571 / ORA-12514,且不提示具体哪一端失败。
- 检查监听器状态:
lsnrctl status,确认输出中包含类似SERVICE "db12g_dgmgrl" has 1 instance(s).的行 - 确认
listener.ora中有对应SID_DESC,且GLOBAL_DBNAME等于DB_UNIQUE_NAME_DGMGRL(不是 INSTANCE_NAME) - tnsnames.ora 中的 connect identifier 条目,其
SERVICE_NAME必须与远端库的DB_UNIQUE_NAME_DGMGRL 完全一致 - 修改后必须
lsnrctl reload,不能只lsnrctl stop/start
别忽略 broker 日志里的真实错误线索
dmon 进程不写 alert.log,所有启动失败细节都在独立 trace 文件里。ORA-16706、ORA-16501 这类泛型错误,90% 的根因藏在 $ORACLE_HOME/rdbms/log/drc<db_unique_name>.trc</db_unique_name> 中。
- 启动失败后立即查该文件,搜索
ERROR或ORA-,重点关注 “unable to connect”, “failed to open config”, “access denied” 等短语 - 常见干扰项:日志目录磁盘满(
df -h $ORACLE_HOME/rdbms/log)、SELinux 拦截(ausearch -m avc -ts recent)、.dat 文件属主不是oracle - 不要手动编辑
.dat文件 —— 它们是二进制格式,损坏即不可恢复
真正安全的“重启”本质是参数切换 + 监听就绪 + 日志验证三步闭环。漏掉任一环,Broker 表面启动了,但内部状态可能已错位,后续 switchover 或 show configuration 就会暴露问题。











