最大可用性模式需LGWR+SYNC+AFFIRM严格协同并配置NET_TIMEOUT:LGWR确保实时同步写入备库SRL,SYNC等待网络响应、AFFIRM强制刷盘,缺一不可;NET_TIMEOUT防止单点故障导致主库挂起,超时自动降级为异步;备库SRL数量与大小须≥主库Online Redo Log。
最大可用性模式(maximum availability)在 oracle 11g data guard 中不是“开个开关就生效”的配置,它依赖 lgwr + sync + affirm 三者严格协同,且必须配合 net_timeout 才能真正兼顾数据不丢和主库不断。
LGWR 进程必须启用,不能用 ARCH
最大可用性要求重做日志实时、同步地传到备库的 standby redo log(SRL),这只有 LGWR 进程能做到。如果误配成 ARCH(归档进程传输),哪怕写了 SYNC,实际也是异步归档触发,无法满足“提交前写入 SRL”的硬性条件。
检查方法:
SHOW PARAMETER log_archive_dest_2
确认输出中包含 LGWR SYNC AFFIRM,而不是 ARCH SYNC NOAFFIRM 或类似组合。
常见错误现象:
- 主库事务提交明显变慢,但备库
v$archived_log显示有归档,v$managed_standby却看不到LGWR连接或RFS写 SRL 的记录 - 切换时提示
ORA-16139: media recovery required,本质是最后一批重做根本没传过去
SYNC + AFFIRM 缺一不可
SYNC 控制传输方式(等待网络响应),AFFIRM 控制落盘行为(强制写入 SRL 并刷盘)。二者必须同时启用,否则 Oracle 不认为该路径满足最大可用性要求。
典型正确配置项:
LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
容易踩的坑:
- 只写
SYNC忘了AFFIRM:备库 RFS 收到日志后仅写入文件系统缓存,断电即丢,主库仍会提交 → 实际退化为最高性能模式 - 写了
AFFIRM但备库没建standby redo log:RFS 无法写入 SRL,直接报错ORA-00344,主库挂起或降级为异步 -
VALID_FOR配错(比如写成(STANDBY_LOGFILES,STANDBY_ROLE)):主库启动时不加载该 dest,整个保护链失效
NET_TIMEOUT 是防止单点故障拖垮主库的关键
最大可用性模式下,主库默认会无限等待备库响应。一旦网络抖动、备库宕机或 SRL 满,主库事务全部卡住 —— 这在生产环境是不可接受的。
必须显式设置 NET_TIMEOUT(单位秒),例如:
LOG_ARCHIVE_DEST_2='SERVICE=standby LGWR SYNC AFFIRM NET_TIMEOUT=30 VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
含义是:主库发起 LGWR 同步请求后,30 秒内未收到备库确认(包括网络超时、RFS 未写完 SRL、SRL 空间不足等),自动降级为异步传输(ASYNC),继续提供服务。
注意点:
-
NET_TIMEOUT不是“重试次数”,超时即降级,不会重试 - 降级后,主库
v$archive_dest_status中该 dest 的STATUS变为DEFERRED,TRANSMISSION_MODE变为ASYNC;需人工干预恢复(如ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE) - 降级期间产生的事务,若未传到备库,在后续 Switchover 时必然丢失 —— 所以要监控
DBA_LOGSTDBY_EVENTS和告警日志中的NET_TIMEOUT记录
备库 SRL 数量与大小必须 ≥ 主库 Online Redo Log
这是最容易被忽略的底层约束。LGWR SYNC AFFIRM 要求每组在线日志(v$log)都必须有对应的一组 SRL 接收并持久化。否则 RFS 无处可写,主库立即报错或降级。
检查命令:
SELECT GROUP#, THREAD#, BYTES/1024/1024 MB FROM v$standby_log;
确保结果行数 ≥ v$log 行数,且单组大小 ≥ 对应 online redo log 组。
常见问题:
- 建备库时只按默认模板建了 3 组 SRL,但主库因高并发已扩到 6 组 online redo log → 第 4 组切换时 RFS 报
ORA-00344,主库卡住 - SRL 大小设为 50MB,而主库 online redo log 是 200MB → RFS 写满即停,后续日志无法接收,主库持续超时降级
补救操作必须在备库 MOUNT 状态下执行:ALTER DATABASE ADD STANDBY LOGFILE ...,不能 ONLINE 添加。











