LOG_ARCHIVE_DEST_n配置冲突会导致归档静默失败,需从参数互斥性、VALID_FOR实时状态和DB_UNIQUE_NAME一致性三方面排查:LOG_ARCHIVE_DEST与LOG_ARCHIVE_DEST_n不能共存,VALID_FOR不匹配时路径被跳过且无日志提示,DB_UNIQUE_NAME大小写或拼写错误会导致Redo静默丢弃,LOG_ARCHIVE_CONFIG缺失或格式错误将导致级联链路中断。
log_archive_dest_n 配置冲突会导致归档静默失败,主库不报错、备库收不到日志,排查必须从参数互斥性、valid_for 实时状态和 db_unique_name 一致性三处下手。
为什么 LOG_ARCHIVE_DEST 和 LOG_ARCHIVE_DEST_n 不能共存
Oracle 明确禁止两者同时生效。只要任意 LOG_ARCHIVE_DEST_n 被设为非空值(哪怕只是 ' '),LOG_ARCHIVE_DEST 就必须显式设为空字符串 '' 或 ' ',否则启动时可能报 ORA-00126 或归档路径被忽略。
-
LOG_ARCHIVE_DEST是 9i 以前的旧参数,仅支持本地路径;LOG_ARCHIVE_DEST_n才支持远程 SERVICE 和完整控制能力 - 检查方式:
SHOW PARAMETER log_archive_dest返回值不是''或' ',就说明冲突已存在 - 修复动作:执行
ALTER SYSTEM SET log_archive_dest='' SCOPE=BOTH;,再重启数据库(仅 ALTER SYSTEM 不足以清除内部缓存)
VALID_FOR 不匹配时为什么查不到错误
VALID_FOR 是运行时开关,不匹配就直接跳过该路径,alert.log 里通常不写任何提示,只在 V$ARCHIVE_DEST_STATUS 中暴露为 STATUS = INACTIVE 或 ERROR = ''。
- 主库发归档到备库,必须是
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE);若误写成(STANDBY_LOGFILES,PRIMARY_ROLE),路径永远不触发 - 中间备库转发日志给下游,需配
VALID_FOR=(ONLINE_LOGFILES,STANDBY_ROLE),否则 RFS 收到但 MRP 不拉取 - 验证命令:
SELECT DEST_ID, STATUS, VALID_TYPE, VALID_ROLE, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID IN (2,3);—— 关注 STATUS 是否为 VALID,ERROR 是否为空
DB_UNIQUE_NAME 大小写/拼写错误的真实表现
Oracle 内部用 DB_UNIQUE_NAME 做路由键,大小写不一致或拼写差一个字符,就会导致 Redo 发送被静默丢弃,且不进 error stack。
- 主库上
LOG_ARCHIVE_DEST_2的DB_UNIQUE_NAME=mid_std_db必须和中间备库实际的V$DATABASE.DB_UNIQUE_NAME完全一致(含大小写) - 现象:主库
ALTER SYSTEM ARCHIVE LOG CURRENT后,V$ARCHIVE_DEST_STATUS.ERROR显示ORA-16664: unable to receive the result from a database - 快速确认法:在中间备库执行
SELECT DB_UNIQUE_NAME FROM V$DATABASE;,复制结果,逐字符比对主库配置中的DB_UNIQUE_NAME值
LOG_ARCHIVE_CONFIG 缺失或格式错误的隐蔽影响
这个参数不是可选的——主库和所有备库都必须显式配置,且内容必须完全一致,否则级联链路第二跳必断,且 alert.log 几乎不报错。
- 正确写法:
LOG_ARCHIVE_CONFIG='DG_CONFIG=(primary_db,mid_std_db,down_std_db)',括号、引号、逗号、大小写全部敏感 - 常见错误:
DG_CONFIG=(primary,standby)(漏引号)、DG_CONFIG='(primary_db,standby_db)'(缺 DG_CONFIG= 前缀)、多一个空格 - 验证命令:
SHOW PARAMETER log_archive_config,返回值必须是非空且格式合规;修改后必须重启数据库,ALTER SYSTEM无效
最容易被忽略的是:所有节点的 LOG_ARCHIVE_CONFIG 必须一模一样,连空格都不能差;而 DB_UNIQUE_NAME 在每个节点上只允许出现一次,重复定义会直接让 MRP 进程无法注册。这两点不手工逐行核对,光看 alert.log 很难定位。


















