DGMGRL是Oracle 19c主备切换唯一靠谱的一键路径;它依赖DB_UNIQUE_NAME、PDB启用、LOG_ARCHIVE_CONFIG双向配置及_DGMGRL监听四项硬性条件,缺一不可,且必须VERIFY CONFIGURATION后才能SWITCHOVER,否则可能切出不同步的“假主库”。

直接用 DGMGRL 配置 broker 是 Oracle 19c 主备切换唯一靠谱的一键路径;手写 SQL 切换看似简单,但漏掉 v$archive_dest_status 校验、switchover_status 判断或日志应用确认,就可能切出一个不同步的“假主库”。
前置条件不满足,DGMGRL 连 connect 都会失败
broker 不是启动了 dg_broker_start=true 就能用。它依赖四个硬性条件,缺一不可:
-
DB_UNIQUE_NAME必须在主备库上显式设置且互不相同(不能和DB_NAME混用) - 主备库都必须启用 PDB(哪怕只用 CDB$ROOT,也得确保
ENABLE_PLUGGABLE_DATABASE=TRUE) -
LOG_ARCHIVE_CONFIG要双向包含,例如:'DG_CONFIG=(slnngk,slavea)',主备库都要设,不能只设一边 - 监听器必须支持
GLOBAL_DBNAME—— 即在listener.ora里加SID_DESC块,其中GLOBAL_DBNAME后缀必须是_DGMGRL,比如slnngk_DGMGRL
常见错误现象:DGMGRL> connect sys/oracle@slnngk 报 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor,大概率就是 GLOBAL_DBNAME 没配对或监听没重载。
DGMGRL 创建配置时 CREATE CONFIGURATION 的参数顺序不能错
必须先连主库,再执行创建命令,且 PRIMARY DATABASE 和 CONNECT IDENTIFIER 要严格对应主库的 TNS 别名(不是实例名,也不是服务名):
DGMGRL> CONNECT sys/oracle@slnngk DGMGRL> CREATE CONFIGURATION 'my_dg_config' AS PRIMARY DATABASE IS 'slnngk' CONNECT IDENTIFIER IS 'slnngk';
接着添加备库,注意 ADD DATABASE 后的数据库名必须和主库 DB_UNIQUE_NAME 一致,CONNECT IDENTIFIER 是备库的 TNS 别名:
DGMGRL> ADD DATABASE 'slavea' AS CONNECT IDENTIFIER IS 'slavea';
容易踩的坑:
- 误把
slavea写成slavea_DGMGRL或slavea.localdomain→ 报ORA-16664: unable to receive the result from a database - 没在备库提前执行
ALTER SYSTEM SET dg_broker_start=true→ 添加后SHOW CONFIGURATION显示DISABLED - 配置完不执行
ENABLE CONFIGURATION→ 后续所有SWITCHOVER命令都提示configuration is disabled
一键切换前必须跑 VERIFY CONFIGURATION,否则 SWITCHOVER 可能静默失败
VERIFY 不是可选步骤,它是 broker 自动检查传输延迟、日志 GAP、角色状态、监听连通性的唯一入口。不验证就切,SWITCHOVER 表面成功,但备库可能卡在 APPLYING_LOG 状态,新主库已开放连接,数据却没追平。
执行流程:
DGMGRL> VERIFY CONFIGURATION; -- 正常输出应含 "Configuration check complete." 和 "Success" 字样 DGMGRL> SWITCHOVER TO slavea;
关键点:
-
VERIFY失败时,错误信息里通常带具体对象,比如transport lag> 0 或apply lag> 0,直接定位到是归档没传过去还是日志没应用完 -
SWITCHOVER命令本身不带WITH SESSION SHUTDOWN参数 —— 这是 SQL*Plus 里的语法,DGMGRL会自动处理会话中断 - 切完立刻查:
SHOW DATABASE VERBOSE slnngk,确认其Role变为PHYSICAL STANDBY,且Intended State是APPLY-ONLINE
Observer 不是必须项,但没它就不是“一键”,而是“半自动”
纯 DGMGRL 切换仍需人工触发命令,而真正意义的“一键”是指故障时自动切换(FSFO)。这必须部署独立 observer 进程:
- observer 机器必须安装同版本 Oracle 软件(不需要 DB 实例,只要
$ORACLE_HOME/bin/dgmgrl) - observer 启动命令:
dgmgrl sys/oracle@slavena START OBSERVER(注意这里连的是备库,observer 本身不连主库) - 启用 FSFO:
EDIT CONFIGURATION SET PROPERTY FastStartFailoverEnabled = TRUE;,再ENABLE FAST_START FAILOVER
容易被忽略的地方:observer 必须始终运行,且网络能同时访问主备库的 _DGMGRL 服务名;一旦 observer 进程挂掉或网络中断,FSFO 自动切换就会失效,退化为人工干预模式。


















