多个SYNC目标导致COMMIT阻塞,因LGWR必须串行等待所有备库落盘确认;生产应仅设一个SYNC核心目标,其余用ASYNC+DELAY规避风险,并验证V$ARCHIVE_DEST_STATUS、归档日志发送及参数配置有效性。
多个 log_archive_dest_n 都设成 sync,主库事务提交就会被卡住——不是“多数派通过即可”,而是“任一 sync 目标未完成,commit 就不返回”。生产环境直接配多个真同步(affirm + sync)基本不可行。
为什么多个 SYNC 目标会让 COMMIT 变慢甚至挂起
Oracle 的 LGWR 进程在 SYNC 模式下必须等待每个启用的 LOG_ARCHIVE_DEST_n 完成写入 standby redo log 并确认(AFFIRM),才会释放事务。这不是并行超时后放弃,而是串行强依赖:
-
LOG_ARCHIVE_DEST_1='SERVICE=site_a SYNC AFFIRM'和LOG_ARCHIVE_DEST_2='SERVICE=site_b SYNC AFFIRM'同时ENABLE→ 主库每次 COMMIT 都要等两地都落盘成功 - 其中任意一地网络抖动、RFS 进程卡顿、磁盘响应慢,都会拖慢全部;
V$ARCHIVE_DEST_STATUS.STATUS会显示DEFERRED或ERROR,但 LGWR 不跳过,只等 -
NET_TIMEOUT控制连接建立超时,不控制数据写入确认耗时;即使设了NET_TIMEOUT=10,只要连接建起来了,后续写入延迟仍会阻塞
如何让多个备库“看起来同步”,又不拖垮主库
真同步只能选一个核心目标;其余用“准同步”策略绕开 LGWR 强依赖:
- 主库只对一个关键备库配
SYNC AFFIRM(如同城机房),确保 RPO=0 - 其他备库统一用
ASYNC NOAFFIRM+LGWR,靠DELAY=30隔离慢链路,避免瞬断引发重试风暴 - 启用
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE),防止主库切为备库后错误推送日志 - 用
DB_UNIQUE_NAME显式绑定目标,比靠 TNS 别名更可靠;TNS 解析失败时,ERROR字段会报ORA-12154,但 ARCn 仍会持续重试
配置后必须验证的三件事
光写参数不等于生效,很多问题在切换或压力场景才暴露:
- 查
V$ARCHIVE_DEST_STATUS:重点看STATUS(应为VALID)、ERROR(非空即故障)、TRANSMIT_MODE(确认是SYNC还是ASYNC)、DESTINATION(是否匹配你配的DB_UNIQUE_NAME) - 手动切日志:
ALTER SYSTEM ARCHIVE LOG CURRENT,然后立刻查V$ARCHIVED_LOG的DEST_ID和CREATOR,确认归档确实发到了对应目标 - 别信
LOG_ARCHIVE_DEST_STATE_n=ENABLE就万事大吉——如果误删了某LOG_ARCHIVE_DEST_n但没清空值(比如留了空字符串),ORA-16057会静默发生,ARCn 仍尝试连接不存在的目标
最容易被忽略的底层约束
LOG_ARCHIVE_DEST_n 不是独立通道,所有目标共享同一组 ARCn 或 LGWR 进程资源。你加到 5 个目标,不是开 5 条线程,而是让单个 LGWR 序列化处理 5 个 TCP 连接、5 套确认逻辑、5 种超时策略。CPU 和网络吞吐压力是线性增长的,而收益只是“多一个备份点”——真正需要多地强一致,该上 Data Guard Broker 的 Fast-Start Failover,而不是堆 SYNC 参数。


















