log_archive_dest配置不当会导致归档频繁切换,主因是目标路径i/o延迟高、空间不足或不可达,引发强制日志切换和等待事件;需检查v$archive_dest_status真实状态、禁用非必需mandatory目标、合理设置valid_for与async。
为什么 log_archive_dest 配置不当会导致归档频繁切换
归档日志频繁切换(如每几分钟就生成一个新归档文件)通常不是因为业务量突增,而是 log_archive_dest 指向的路径 i/o 延迟高、空间不足或目标不可达,导致 oracle 无法及时完成归档写入。此时 lgwr 或 arch 进程会反复重试,触发强制日志切换(alter system switch logfile 被隐式调用),进而引发 log file switch (archiving needed) 等等待事件。
关键点在于:Oracle 不会“等”归档完成才写下一个日志组——只要当前联机日志组被标记为“需要归档”,且归档未完成,下次日志切换时就会卡住或强制推进,形成恶性循环。
-
LOG_ARCHIVE_DEST_1若指向 NFS 或慢速存储,ARCH进程超时(默认ARCHIVE_LAG_TARGET=0,无超时控制)后可能放弃并报ORA-16038或ORA-19809 - 多个
LOG_ARCHIVE_DEST_n中若存在MANDATORY但不可用的目标,整个归档链路会被阻塞 -
DELAY属性在 Data Guard 中常被误用于“缓冲”,但它只延迟传输,不缓解本地归档压力
如何检查归档目的地是否真正可用且低延迟
别只看 SELECT STATUS, DESTINATION FROM V$ARCHIVE_DEST 显示 VALID 就放心——这仅表示参数语法正确。真实瓶颈藏在传输耗时与错误历史里。
- 查最近归档失败:
SELECT * FROM V$ARCHIVE_DEST_STATUS WHERE FAILURE IS NOT NULL OR STATUS = 'ERROR' - 看归档延迟(单位秒):
SELECT DEST_ID, ARCHIVED_THREAD#, ARCHIVED_SEQ#, APPLIED_THREAD#, APPLIED_SEQ#, DELAY_MINS FROM V$ARCHIVE_DEST_STATUS;若DELAY_MINS > 0且持续增长,说明传输层卡住 - 确认物理路径 I/O 性能:
ls -ld /u01/archivelog+dd if=/dev/zero of=/u01/archivelog/test bs=8k count=1000 oflag=direct,避免误判 NFS 缓存假象 - 禁用非必需的
MANDATORY目标:除非业务强要求“主库必须等备库收到才提交”,否则所有LOG_ARCHIVE_DEST_n应设为OPTIONAL
LOG_ARCHIVE_DEST 的最小安全配置组合
多数 Data Guard 环境只需两个归档目的地:本地快速盘 + 远程备库。其余冗余路径(如另一台备份服务器)应移出 LOG_ARCHIVE_DEST_n,改用 RMAN 异步备份补位,避免拖慢主库。
- 本地归档(必选):
LOG_ARCHIVE_DEST_1='LOCATION=/u01/archivelog VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=prod'——VALID_FOR必须覆盖ALL_LOGFILES,否则 standby 切换为主库后可能无法归档 - 远程备库(必选):
LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'—— 用ASYNC避免主库等待,SYNC仅在极少数金融级零数据丢失场景下启用 - 禁用自动归档到慢速设备:
LOG_ARCHIVE_DEST_3若指向磁带库或远程 CIFS,直接注释掉,改由RMAN BACKUP ARCHIVELOG定时执行 - 关闭归档压缩(除非网络真瓶颈):
LOG_ARCHIVE_DEST_2中不要加COMPRESSION=ENABLE,压缩消耗 CPU 可能比网络节省更伤性能
归档频率异常时的紧急干预步骤
当发现 v$log_history 中日志切换间隔突然缩短至 1–2 分钟,且 v$archive_dest_status 显示某目标 STATUS=INACTIVE 或 ERROR,按顺序操作:
- 立刻检查对应路径空间:
df -h /u01/archivelog,空间不足时清理过期归档(RMAN> DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7'),而非临时改路径 - 临时禁用故障目标:
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_3=DEFER(假设是 _3 出问题),避免它拖累其他路径 - 强制归档当前日志并观察:
ALTER SYSTEM ARCHIVE LOG CURRENT,再查v$archive_dest_status的TRANSMITTED和ERROR列是否清空 - 确认无
ORA-16057(DG Broker 代理冲突)或ORA-16714(属性不一致)后再恢复LOG_ARCHIVE_DEST_STATE_n=ENABLE
归档路径本身没有“优化开关”,它的稳定性取决于底层存储响应速度和配置的容错粒度。最容易被忽略的是 VALID_FOR 参数——它决定了角色切换后该路径是否参与工作,配错会导致备库升主后归档静默失败,数小时后才暴露。











