切换保护模式前须确认protection_mode可写且未锁定,检查主备库配置是否满足目标模式硬性要求,如standby redo log、sync传输参数、mrp进程等;常见安全路径是从maximum performance升级至maximum availability;严禁单点standby启用maximum protection,否则网络或存储异常将导致主库强制宕机;切换后须验证传输状态、归档应用情况及延迟指标,并注意delay属性被清空需手动恢复。

切换前必须确认 PROTECTION_MODE 可写且未被强制锁定
Oracle 不允许直接用 ALTER DATABASE SET PROTECTION MODE 命令在任意状态下切换模式。如果执行时报错 ORA-16625: cannot reach database 或 ORA-16627: no standby databases satisfy the protection mode,大概率是当前配置不满足目标模式的硬性前提——比如想切到 MAXIMUM PROTECTION 却没配 standby redo log,或没启用 LGWR 传输。
检查关键条件是否就位:
-
V$DATABASE.PROTECTION_MODE和PROTECTION_LEVEL当前值需先查清,用SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$DATABASE; - 目标模式要求的
LOG_ARCHIVE_DEST_n参数必须已设置:例如MAXIMUM AVAILABILITY要求至少一个LOG_ARCHIVE_DEST_2含SYNC NOAFFIRM或SYNC AFFIRM,且VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) - 所有参与同步的 standby 必须处于
ARCHIVE LOG模式、已启动MRP进程、且STANDBY REDO LOG组数 ≥ 主库 online redo log 组数 - 主库和备库的
DB_UNIQUE_NAME必须在LOG_ARCHIVE_CONFIG中显式声明,漏掉任何一个都会导致切换失败
从 MAXIMUM PERFORMANCE 切到 MAXIMUM AVAILABILITY 的实操路径
这是最常见也最安全的升级路径,因为 MAXIMUM PERFORMANCE 是默认模式,对主库无阻塞,而 MAXIMUM AVAILABILITY 在故障时能降级回异步,不强制停库。
操作分三步,缺一不可:
- 先在主库添加同步传输目标:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=stby1 SYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=stby1'; - 在 standby 上创建足够数量的
STANDBY REDO LOG(组数 ≥ 主库 online redo log 组数,每组大小 ≥ 主库最大日志文件),否则LGWR无法启动同步传输 - 最后执行切换命令:
ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;注意不是SET PROTECTION MODE,这个语句才是 Oracle 认可的合法语法
执行后立即查 V$DATABASE,若 PROTECTION_LEVEL 仍为 RESOLVABLE GAP,说明 standby 还没追平;等它变成 MAXIMUM AVAILABILITY 才算真正生效。
为什么不能直接切到 MAXIMUM PROTECTION
直接切 MAXIMUM PROTECTION 是高危操作,99% 的生产事故源于此步踩坑。它的核心限制是:只要有一个同步 standby 不可用,主库立刻 SHUTDOWN ABORT,不是报错,是真关机。
典型触发场景:
- 网络抖动超过 3 秒,
RFS进程收不到LGWR的 ACK,主库挂起 - standby 归档目录满,
ARCH进程卡住,导致MRP停摆,主库判定“不可用” - 只配了一个 standby,它因维护重启,主库瞬间失去同步目标,强制宕机
所以 Oracle 官方文档明确建议:启用 MAXIMUM PROTECTION 前,必须部署至少两个物理 standby,并确保它们跨网络域、跨存储阵列。单点 standby + MAXIMUM PROTECTION 等于主动埋雷。
切换后必须验证实时应用状态和日志延迟
模式切完只是开始,真正决定成败的是后续监控。重点盯两个指标:
- 主库上查
V$ARCHIVE_DEST_STATUS,确认目标DEST_ID的STATUS是VALID,TRANSMIT_MODE是SYNC,PROTECTION_MODE显示匹配目标值 - 备库上运行:
SELECT SEQUENCE#, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE# DESC FETCH FIRST 5 ROWS ONLY;看最新几条归档是否都标为YES;如果出现NO,说明 MRP 没跑起来,得手动RECOVER MANAGED STANDBY DATABASE DISCONNECT; - 用
DGMGRL查延迟:SHOW DATABASE VERBOSITY stby1,关注Apply Lag和Transport Lag是否稳定在毫秒级;一旦拉长到秒级,说明 SYNC 链路已退化为 ASYNC,要立刻查网络或 I/O
最易被忽略的一点:保护模式切换后,LOG_ARCHIVE_DEST_n 的 DELAY 属性会被自动清空——如果你之前靠 DELAY=30 实现人工容灾窗口,切完模式就得重新加回去,否则备用库将实时应用每一笔变更,再无缓冲余地。











