Oracle RAC备库服务无法启动的根本原因是Data Guard Broker进程(dmon)未启动或无法连接备库实例,首要排查dg_broker_start参数是否在所有RAC实例中设为TRUE且SCOPE=BOTH,其次验证DG_BROKER_CONFIG_FILE1/2路径有效性、监听器静态注册GLOBAL_DBNAME是否严格等于DB_UNIQUE_NAME,以及Broker日志drc.trc中的连接失败线索。

Oracle RAC 备库服务无法启动,不是“服务没注册”或“监听没配好”这种表层问题——根本原因通常是 Data Guard Broker 进程(dmon)压根没起来,或者 Broker 虽然运行但连不上备库实例。直接查 srvctl status service 或 lsnrctl services 没用,得先确认 Broker 是否真正就绪。
dg_broker_start 是否真为 TRUE 且持久生效
这是最常被忽略的硬性前提。Broker 启动失败,90% 都卡在这一步。
-
SHOW PARAMETER dg_broker_start必须返回TRUE,且SCOPE列显示BOTH或SPFILE;只设MEMORY的配置在重启后就失效 - RAC 环境下必须所有实例都满足:执行
SELECT INST_ID, VALUE FROM GV$PARAMETER WHERE NAME = 'dg_broker_start',任一实例为FALSE或SCOPE不含BOTH,Broker 就不会启动 - 改完参数后没重启数据库?或者只在单实例执行了
ALTER SYSTEM SET ...?RAC 必须用ALTER SYSTEM SET ... SCOPE=BOTH SID='*'
DG_BROKER_CONFIG_FILE1/2 路径是否真实可写
Broker 不会自动创建父目录,路径不存在或权限不对会导致静默失败,日志里只报泛型错误如 ORA-16786。
- 查参数:
SHOW PARAMETER DG_BROKER_CONFIG_FILE1,然后手动验证路径是否存在:ls -l $(dirname /path/to/dr1prim.dat) - 目录属主必须是
oracle用户(不能是root或grid),权限建议755;文件本身建议644 - 若路径指向 ASM(如
+DATA/dgbroker/dr1standby.dat),先确认该 diskgroup 已MOUNTED,且oracle用户有 ASM 权限(asmcmd lsdg查状态) - 磁盘空间不足或文件系统只读也会触发失败:
df -h和mount | grep $(dirname $ORACLE_HOME)快速验证
监听器是否静态注册且 GLOBAL_DBNAME 匹配 DB_UNIQUE_NAME
Broker 启动时会尝试连接所有配置中的数据库,哪怕你只操作主库,只要备库监听不通,整个 Broker 就卡住或报 ORA-16571、ORA-12514。
- 备库的
listener.ora中必须有静态注册条目:(SID_DESC = (SID_NAME = orcl) (GLOBAL_DBNAME = standby_db)),其中GLOBAL_DBNAME必须严格等于备库的DB_UNIQUE_NAME(不是INSTANCE_NAME,也不是SERVICE_NAME) - 在备库上执行
lsnrctl status,确认该服务状态是READY,不是UNKNOWN - 主库
tnsnames.ora中指向备库的 connect identifier,其SERVICE_NAME必须等于备库的DB_UNIQUE_NAME;否则dgmgrl连接时会失败 - Broker 日志(
$ORACLE_HOME/rdbms/log/drc<db_unique_name>.trc</db_unique_name>)里会有明确的连接失败记录,比alert.log更直接
srvctl add service 后服务仍不启动的真相
即使 Broker 正常,RAC 备库上的服务也不会自动运行——srvctl add service 只写入 CRS 元数据,不触发启动动作。
- 必须显式执行:
srvctl start service -d <db_name> -s <service_name> - 检查服务是否绑定到在线实例:
srvctl status instance -d <db_name>,如果目标实例是OFFLINE,服务自然起不来 - Policy-managed 数据库默认只在部分实例运行服务,需用
-i指定实例,或用-r设置首选实例列表 - 业务隔离靠的是
SERVICE_NAME,不是INSTANCE_NAME;应用连接字符串里必须用SERVICE_NAME=xxx,否则流量不会路由到备库服务
真正麻烦的点不在命令怎么敲,而在 Broker 的依赖链太长:参数 → 配置文件 → 监听注册 → 实例连通性 → CRS 资源状态。任何一个环节断掉,dmon 进程都不会真正拉起,后续所有服务操作都只是空中楼阁。


















