必须先关闭dg_broker_start参数(设为false)并清除dmon进程,再同步执行disable database和remove configuration,随后备份spfile、清理dg相关参数,最后安全删除standby redo log。

确认 dg_broker_start 已关闭,否则 dgmgrl 命令全失效
执行 dgmgrl 命令前,必须确保主库和备库的 dg_broker_start 参数为 FALSE。否则所有 DISABLE / REMOVE 操作都会静默失败或报 ORA-16501。检查方式是登录 SQL*Plus 后运行:
SHOW PARAMETER dg_broker_start
若返回 TRUE,立即执行:
ALTER SYSTEM SET dg_broker_start=FALSE SCOPE=BOTH;
然后确认后台无残留进程:
-
ps -ef | grep dmon应无输出(dmon是 broker 的守护进程) - 若仍有进程,需手动
kill -9并等待几秒再查
主备库同步执行 DISABLE DATABASE + REMOVE CONFIGURATION
Broker 配置是跨实例共享的,主库和备库必须严格按顺序、同步执行,否则触发 ORA-16748 或 ORA-16603。操作顺序不能颠倒:
- 先在主库执行:
DISABLE DATABASE <db_unique_name></db_unique_name> - 再在备库执行同名命令:
DISABLE DATABASE <db_unique_name></db_unique_name> - 待两库均返回成功后,任一端执行:
REMOVE CONFIGURATION
注意:REMOVE CONFIGURATION 仅在配置中只剩一个数据库时才被允许;若报 ORA-16713: command timed out,说明网络不通或监听未响应,不要重试,先检查 tnsping 和 lsnrctl status。
清理残留参数前先备份 SPFILE/PFILE
删除 Broker 后,初始化参数中仍存大量 DG 相关项,直接修改有风险。务必先备份:
CREATE PFILE='/tmp/init_before_dg_remove.ora' FROM SPFILE;
然后逐个重置或清空以下关键参数(需重启生效的用 SCOPE=SPFILE,否则用 SCOPE=BOTH):
-
LOG_ARCHIVE_CONFIG→ 设为NODG_CONFIG -
LOG_ARCHIVE_DEST_2及更高编号(如_3)→ 清空字符串:'' -
LOG_ARCHIVE_DEST_STATE_2→ 设为DEFER -
FAL_SERVER/FAL_CLIENT→ 清空 -
STANDBY_FILE_MANAGEMENT→ 设为MANUAL(避免后续误触发) -
DG_BROKER_CONFIG_FILE1/2→ 用ALTER SYSTEM RESET移除
特别注意:DB_FILE_NAME_CONVERT 和 LOG_FILE_NAME_CONVERT 必须用 RESET,不能设为空字符串,否则重启时报错。
删 standby redo log 前先确认 V$STANDBY_LOG 无活动组
备用重做日志(SRL)是 DG 特有组件,Broker 删除后必须清理,但不能在 MRP/LSP 进程还在读取时硬删。先查:
SELECT GROUP#, DBID, STATUS FROM V$STANDBY_LOG;
若 STATUS 为 ACTIVE 或 UNASSIGNED,说明仍有进程依赖;此时应先停掉日志应用(备库)或确认主库无 SRL 写入(主库)。安全做法是:
- 主库上:确保
ARCHIVE_LAG_TARGET = 0且归档目标已全部DEFER - 执行
ALTER DATABASE DROP STANDBY LOGFILE GROUP <n></n>逐个删除 - 删完后再次查询
V$STANDBY_LOG,结果集应为空
这一步最容易被跳过,但残留 SRL 会干扰后续 RMAN 备份、控制文件自动扩展等操作,且在下次启用 DG 时引发 ORA-19527 日志重命名错误。











