oracle data guard保护模式切换必须在mount状态,因涉及重做传输硬约束(如affirm、sync),动态修改会破坏一致性;需提前对齐log_archive_dest_n参数并配置standby redo log,否则protection_level降级。

不能在线切换。Oracle Data Guard的保护模式(MAXIMIZE PROTECTION、MAXIMIZE AVAILABILITY、MAXIMIZE PERFORMANCE)必须在主库处于 MOUNT 状态下才能修改,任何尝试在 OPEN 状态执行 ALTER DATABASE SET STANDBY DATABASE TO ... 都会报错 ORA-01126。
为什么必须 mount 状态?
保护模式变更涉及底层重做传输行为的硬性约束(如是否强制 AFFIRM、是否要求 SYNC 写入 standby redo log),这些约束直接影响事务提交路径。Oracle 不允许在数据库已开放服务时动态切换该机制,否则可能破坏数据一致性语义或导致状态不一致。
常见错误现象:ORA-01126: database must be mounted in exclusive mode and not open for this operation
- 即使只是从
MAXIMUM PERFORMANCE切到MAXIMUM AVAILABILITY,也必须先SHUTDOWN IMMEDIATE,再STARTUP MOUNT - RAC 环境下需关闭所有实例,仅启动一个实例至
MOUNT状态后操作 - 切完模式后必须显式执行
ALTER DATABASE OPEN,否则库仍停留在MOUNT
log_archive_dest_n 参数必须提前对齐
保护模式切换不是孤立命令,它依赖归档传输配置是否满足目标模式要求。比如 MAXIMIZE PROTECTION 要求 LGWR SYNC AFFIRM,而 MAXIMIZE PERFORMANCE 允许 ARCH ASYNC。参数不匹配会导致切换后实际行为降级或报错。
关键参数差异:
-
MAXIMIZE PROTECTION和MAXIMIZE AVAILABILITY:都必须设LGWR SYNC AFFIRM,且备库必须有standby redo log -
MAXIMIZE PERFORMANCE:可用ARCH或LGWR ASYNC,不要求standby redo log -
VALID_FOR必须含(ONLINE_LOGFILES,PRIMARY_ROLE),否则角色切换后归档路径失效 - 主备两端的
log_archive_dest_2需分别配置指向对方,且DB_UNIQUE_NAME必须与实际一致
备库 standby redo log 是硬门槛
没有 standby redo log,MAXIMIZE PROTECTION 和 MAXIMIZE AVAILABILITY 无法生效——即使命令执行成功,v$database.protection_level 仍显示 RESYNCHRONIZATION 或降级为 MAXIMUM PERFORMANCE。
添加方式(在备库 MOUNT 状态下执行):
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4
('/u01/app/oracle/fast_recovery_area/ORCL/standby04.log') SIZE 200M;
- group 编号不能与主库 online redo log group 冲突
- 建议至少建 3 组,每组大小 ≥ 主库最大 online redo log size
- 添加后无需重启,但必须确保
RECOVER MANAGED STANDBY DATABASE已启用(否则 SRL 不被使用)
切换后必须验证 protection_level
protection_mode 字段只反映你“想设成什么”,真正起作用的是 protection_level。两者不一致说明配置未就绪。
检查命令:
SELECT protection_mode, protection_level FROM v$database;
- 理想结果:
PROTECTION_MODE = PROTECTION_LEVEL,例如都是MAXIMUM AVAILABILITY - 若
protection_level显示MAXIMUM PERFORMANCE,说明 standby redo log 缺失、AFFIRM未启用或网络不通 - 备库也要查 —— 角色切换后它可能成为新主库,配置必须对称
最易被忽略的是:改完主库参数、切完模式、开库之后,忘了去备库确认 protection_level 是否同步更新。一旦故障发生,才发现备库实际运行在降级模式下。











