必须先确认保护模式和数据库角色,仅MAXIMUM AVAILABILITY或MAXIMUM PROTECTION需降级;执行前须停同步、确保主库OPEN且备库无MRP进程;降级后若仍不可写,需排查STANDBY_FILE_MANAGEMENT、归档目标状态及FORCE LOGGING等隐含依赖。
确认当前保护模式和数据库角色
先连到主库查清楚现状,避免误操作。用 select database_role, protection_mode from v$database; 看是不是真在 maximum availability 或 maximum protection 下——只有这两种才需要降级才能放开主库写入。如果已经是 maximum performance,那问题不在保护模式上,得去查其他锁或挂起状态。
关闭实时应用并停止DG同步
降级前必须让备库停止接收日志,否则 ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE 会报 ORA-16664: unable to retrieve the result from a database。在主库执行:ALTER DATABASE STOP LOGICAL STANDBY APPLY;(逻辑备库)ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;(物理备库)
再确认 V$MANAGED_STANDBY 里没有活跃的 MRP 进程。
执行保护模式降级命令
命令本身简单,但顺序和前提缺一不可。确保:
• 主库处于 OPEN 状态(不能是 MOUNT)
• 备库已停止同步且未报错
• LOG_ARCHIVE_DEST_n 中至少一个 VALID_FOR 包含 (ONLINE_LOGFILES, PRIMARY_ROLE)
然后运行:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
成功后立刻查 V$DATABASE.PROTECTION_MODE,必须显示 MAXIMUM PERFORMANCE 才算生效。
降级后主库仍不可写?检查隐含依赖
常见假象:模式降了,但主库还是只读。原因往往不是 DG 配置,而是:
• STANDBY_FILE_MANAGEMENT=auto 导致文件创建被阻塞(临时改 manual)
• 备库归档目标 LOG_ARCHIVE_DEST_2 状态为 ERROR,触发主库自动只读(查 V$ARCHIVE_DEST_STATUS.ERROR)
• 数据库启用了 FORCE LOGGING 但归档路径磁盘满,日志切换卡住
这些都会让主库表面可写、实际 DML 报 ORA-01116: error in opening database file 或 hang 住。
真正麻烦的是备库还没完全停稳就降级,或者降级后忘了重开日志传输——这时候主库能写,但备库会彻底脱节,后续拉起可能要重建。操作窗口很窄,每步都得盯 V$DATAGUARD_STATS 和告警日志。

















