必须满足四个硬性条件:主备库均开启FORCE_LOGGING;备库处于MOUNT状态、LGWR SYNC且NOAFFIRM;备库配置standby redo log并MRP实时应用;切前停大事务,切后验证PROTECTION_LEVEL是否为MAXIMUM PROTECTION。
不能直接切,必须先满足四个硬性条件,否则 ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION 一定失败。
很多人卡在 ORA-16627,查了半天参数,结果是备库没开强制日志——主库开了,备库不会自动继承。
SELECT FORCE_LOGGING FROM V$DATABASE;,主库和备库都必须返回 YES
ALTER DATABASE FORCE LOGGING;
ALTER DATABASE FORCE LOGGING;(哪怕刚从主库复制过来)最大保护模式只接受 LGWR SYNC 且备库处于 MOUNT,NOAFFIRM 是关键——用 AFFIRM 容易因存储延迟导致主库提交卡住。
SELECT DATABASE_ROLE, OPEN_MODE FROM V$DATABASE; 必须是 PHYSICAL STANDBY 和 MOUNTED
SELECT DEST_NAME, TRANSMISSION_MODE, AFFIRM FROM V$ARCHIVE_DEST_STATUS WHERE STATUS = 'VALID';
LOG_ARCHIVE_DEST_2(或对应编号)设为:SERVICE=standby LGWR SYNC NOAFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=xxx
DISABLE CONFIGURATION,Broker 不校验最大保护的底层约束ORA-16826 的本质是 Oracle 发现最近 5 秒内还有 redo 没同步完——哪怕只差几百字节,就会拒绝切换。
SELECT * FROM V$STANDBY_LOG; 返回至少一组非空记录(组数建议 ≥ 主库 online redo log 组数 + 1)SELECT PROCESS, STATUS, SEQUENCE# FROM V$MANAGED_STANDBY WHERE PROCESS = 'MRP0';,STATUS 必须是 APPLYING_LOG,且 SEQUENCE# 与主库 V$LOG.HIGH_SEQUENCE# 相差 ≤ 1执行完 ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION 后,V$DATABASE.PROTECTION_MODE 显示 MAXIMUM PROTECTION 只是第一步,真正要盯的是 PROTECTION_LEVEL 字段是否同步变成 MAXIMUM PROTECTION——两者不一致说明内部校验没通过,实际仍是降级状态。
SELECT PROTECTION_MODE, PROTECTION_LEVEL FROM V$DATABASE;
PROTECTION_LEVEL 是 RESYNCHRONIZATION 或 MAXIMUM PERFORMANCE,说明某处配置仍不满足,比如 standby redo log 大小不匹配、网络抖动导致瞬时不同步、或备库监听端口被防火墙拦截shutdown abort,不是警告,是立即中止