游乐游手机版
首页/数据库/文章详情

Oracle 11g DG主库归档日志无法传送到远程节点原因排查

时间:2026-06-24 07:44
Oracle11gDG主库归档日志无法传送到备库的常见原因包括:归档目标状态被设为DEFER、传输配置缺少SERVICE或拼写错误、密码文件缺失或SYS权限未同步、防火墙或监听器拦截。排查应依次检查参数状态、配置完整性、密码文件和网络连通性。

前言:DG备库不同步,先别急着重启

先说最常遇到的情况。很多运维人员发现备库延迟、归档不传输时,第一反应就是检查网络、重启监听、重构DG配置,兜了一大圈才发现,问题其实就是一行参数没设对。Oracle Data Guard同步异常排查,有个很简单的逻辑顺序:先看参数状态 → 再查配置完整性 → 确认密码文件 → 最后验证网络连通性。按照这个顺序来,大部分DG同步问题都能很快定位。

log_archive_dest_state_2 是 DEFER 状态

这个情况最容易被当成“正常”忽略掉。主库的归档日志生成看起来一点问题都没有,但备库就是收不到任何数据。为什么会这样?因为主库压根就没打算发送。

检查v$parameter中的log_archive_dest_state_2,如果显示DEFER,那一切都说得通了——无论什么原因导致该参数被设为DEFER(人工误操作、异常中断、脚本bug都可能),LGWR或ARCn进程都不会向备库推送任何日志。这是最常见也最低级的Data Guard配置问题。

为什么Oracle 11g DG主库的归档日志无法传送到远程节点

排查方法很直接:SELECT NAME, VALUE FROM v$parameter WHERE name = 'log_archive_dest_state_2';。如果返回DEFER,立刻执行ALTER SYSTEM SET log_archive_dest_state_2 = ENABLE SCOPE=BOTH;。注意,RAC环境中这条命令对所有实例生效,不需要逐节点操作。但有一个隐患:假如操作系统重启后参数被重置(以前确实有类似的坑),一定要加个监控或启动脚本确保参数持久化。

LOG_ARCHIVE_DEST_2 配置缺失 SERVICE 或拼写错误

这一点听起来很基础,但出错的频率绝对不低。参数配置里如果不写SERVICE=xxx,Oracle就会把它当成本地归档路径,压根不触发网络传输。哪怕其他参数全都对,这个字母配错了,就等于白忙一场。

举个例子,有人可能把配置写成:LOG_ARCHIVE_DEST_2='LOCATION=/arch'。这是本地路径,不是DG传输。正确的最小可用配置应该是这样:

LOG_ARCHIVE_DEST_2='SERVICE=standby_db ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby_db'

配完之后,必须用这句验证:SELECT STATUS, ERROR FROM v$archive_dest_status WHERE DEST_ID = 2;。期望的结果是STATUSVALIDERROR列为空。如果看到了ORA-16057: DGID not set这种错误,那基本就是DB_UNIQUE_NAME没有对上LOG_ARCHIVE_CONFIG里的配置。

密码文件缺失或 SYS 权限未同步

这是个比较隐蔽的问题,往往让人卡很久。RAC主库的LGWR进程是用SYS身份去连接备库监听器的。如果备库的密码文件不存在,或者密码文件和主库不一致(特别是直接复制过去却没有重建的情况),那LGWR就会静默失败——不报明显的错误,也不传输日志。

现象非常有特点:在v$managed_standby里看到LNS状态长期IDLESEQUENCE#根本不涨,但v$archive_dest_statusERROR列却是空的,或者只显示一个模糊的超时。这种情况下,最有效的做法就是重建密码文件:orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password= force=y。然后保证主库和备库两端密码完全一致,SYS用户在备库也必须拥有SYSDBA权限。

防火墙或监听器拦住了归档流

很多人有一个认知误区:归档传输走的是SQL*Net通道,默认端口1521。但问题是,这个1521是监听器端口,不是数据库实例端口,也不是普通的连接路径。很多运维人员只开了实例端口,但监听器本身要能收发大包这一点却漏掉了。

排查思路很简单:先用telnet standby_host 1521做底层连通性测试,必须能通。然后在备库检查监听器状态:lsnrctl status,确认服务名(比如standby_db)是READY状态,而不是UNKNOWN。如果这两步都没问题,但问题依然存在,特别是跨地域传输的时候(比如北京到云南这么远的距离),防火墙往往会限制单包大小,导致归档传输卡在中间。这种情况下,要么调大MTU,要么找网络团队配合放行大包。

真正难排查的,往往是监听器看起来“一切正常”,但归档流被防火墙无声丢弃。你可能在ALERT.LOG里只看到ARCn: Terminating ARCH hung on a network operation这种模糊提示。这时候别瞎猜,直接抓包或临时关闭防火墙验证,是最快的解决办法。

来源:https://www.php.cn/faq/2678609.html
上一篇Oracle 19c RMAN异机不完全恢复步骤详解 下一篇如何通过ODP.NET利用OracleDataAdapter.Update与ArrayBindCount特性实现批量更新的完整方法详解
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis 7.0增量AOF重写RDB前导码配置详解
数据库 · 2026-07-02

Redis 7.0增量AOF重写RDB前导码配置详解

先说一个几乎所有人都踩过的典型误区:很多人把 aof-use-rdb-preamble yes 当作开启“增量重写”的开关。实际上,这个配置只干了一件事——让重写后的 AOF 文件头部带上 RDB 快照。它解决的是加载速度问题,跟“增量重写”本身的概念压根不是一回事。真正的增量重写,依赖的是 Red

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践
数据库 · 2026-07-02

在Python Tornado异步框架中安全执行SQL命令的方法与最佳实践

直接在Tornado里用SQLAlchemy同步执行SQL,结果就是阻塞IOLoop,所谓“异步框架里写同步数据库代码”,等于白搭。安全执行的关键不是“怎么写SQL”,而是“怎么不卡住事件循环”。 为什么不能在RequestHandler里直接调用session execute() 因为sessio

利用SQL触发器实现在INSERT数据时自动同步到审计表
数据库 · 2026-07-02

利用SQL触发器实现在INSERT数据时自动同步到审计表

先说结论:可以用触发器把 INSERT 数据同步到审计表,但必须用 AFTER INSERT,并且审计表的字段顺序、类型、字符集得和源表严格一致。否则,轻则写入错位、数据截断,重则直接报错、丢数据。下面把这些坑一个一个掰开说。 能,但必须用 AFTER INSERT,且审计表字段顺序、类型、字符集要

如何用SQL编写按不同工作日统计员工出勤率
数据库 · 2026-07-02

如何用SQL编写按不同工作日统计员工出勤率

在实际业务中,统计不同工作日的出勤率是HR系统里的高频需求。如果直接按日期函数分组,很容易掉进语言环境、索引失效或分母口径的坑里。下面就来拆解具体的实现要点。 必须用 CASE WHEN 将日期映射为固定 weekday 标签(如 Mon )再分组,避免语言环境导致的分组断裂;需过滤 DOW IN

Spring Boot 3动态拼接SQL为何引发严重安全漏洞
数据库 · 2026-07-02

Spring Boot 3动态拼接SQL为何引发严重安全漏洞

SQL注入漏洞的核心成因,本质上是因为用户输入直接参与了SQL语句的字符串拼接,而未采用参数化绑定机制。在MyBatis中使用${}、QueryWrapper中调用apply()与last()、JPA的@Query注解进行拼接等操作,都会绕过PreparedStatement的安全防护。动态字段必须