Oracle Data Guard PING[ARC2]: Heartbeat failed to connect to standby ''. Error is 12514 故障分析

本文记录了一次解决Oracle Data Guard中ORA-12514错误的过程,通过排查网络配置和/etc/hosts文件,最终解决了DG连接失败的问题。

原文地址:http://blog.youkuaiyun.com/tianlesoftware/article/details/9670973

朋友搭建的一套DG,折腾了很长时间,一直都是报如下错误:

ORA-12514: TNS:listener does not currentlyknow of service requested in connect descriptor

PING[ARC2]: Heartbeat failed to connect tostandby 'PD'. Error is 12514.

 

这个错误最常见的原因,静态注册,再就是DG 参数的问题。

 

但这里参数,我也瞅了半天,并没有问题:

SQL> show parameter dest_2

 

NAME                                 TYPE        VALUE

----------------------------------------------- ------------------------------

db_create_online_log_dest_2          string

log_archive_dest_2                   string      SERVICE=PD VALID_FOR=(ONLINE_L

                                                OGFILE,PRIMARY_ROLE) DB_UNIQUE

                                                _NAME=PD

 

期间还让朋友做了很多的测试,包括重建口令文件,把DG 可能出现的问题,都想了一遍,还是有问题。

 

查看相关的进程:备库没有RFS进程,主库没有LNS进程。

SQL> select process, status, thread#,sequence#, block#, blocks from v$managed_standby;

 

PROCESS  STATUS          THREAD#  SEQUENCE#    BLOCK#     BLOCKS

--------- ------------ -------------------- ---------- ----------

ARCH     CONNECTED             0          0          0          0

ARCH     CONNECTED             0          0          0          0

ARCH     CONNECTED             0          0          0          0

ARCH     CONNECTED             0          0          0          0

 

后来让朋友再次tnsping PD看看,其实这个测试,在最开始的时候,我就已经让朋友测试过了。

 

tnsping 是正常的,也就是说,测试网络是通的,listener是正常的。 这个也是我们的tnsping 能干的工作,但是tnsping 不能检查tnsnames.ora 文件里的service_name或sid是否正确,所以也让朋友贴了这2个文件。

    并用sqlplus 连接了这个配置,也正常。

 

    问题看上去变得非常奇葩,因为DG本身就没几个参数,把我能想到的,问题都想了一遍,还有不通,后来看到朋友写的测试结果:

 

 

 

[oracle@DB11g_ST trace]$ tnsping PD

TNS Ping Utility for Linux: Version 11.2.0.1.0 - Production on 31-JUL-2013 16:11:18

 

Copyright (c) 1997, 2009, Oracle.  All rights reserved.

Used parameter files:

 

Used TNSNAMES adapter to resolve the alias

Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = DB11g)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl)))

OK (10 msec)

 

对这里的HOST 产生了兴趣,之前怀疑过防火墙的问题,但防火墙是关闭的,所以让朋友把这里改成IP地址,居然OK了。

 

SQL> select process, status, thread#,sequence#, block#, blocks from v$managed_standby;

 

PROCESS  STATUS          THREAD#  SEQUENCE#    BLOCK#     BLOCKS

--------- ------------ -------------------- ---------- ----------

ARCH     CONNECTED             0          0          0          0

ARCH     CLOSING               1        156       2049       1600

ARCH     CONNECTED             0          0          0          0

ARCH     CONNECTED             0          0          0          0

RFS      IDLE                  0          0          0          0

RFS      IDLE                  0          0          0          0

RFS      IDLE                  0          0          0          0

RFS      IDLE                  1        157         27          1

 

这次查询,RFS进程也出现了。

 

朋友主备库的/etc/hosts 文件是直接复制过去的。 如下:

 

[root@DB11g_ST ~]# more /etc/hosts

# Do not remove the following line, or various programs

# that require network functionality will fail.

127.0.0.1               DB11g localhost.localdomain localhost

192.168.0.89            DB11g_ST

192.168.0.88            DB11g

 

问题就出在这里,DB11g 这里有个回环地址:127.0.0.1。 后来朋友把这个注释掉,使用别名测试,也正常了。

 

在这个问题里面,饶了很大的一个圈子,之前我们一直围绕在数据库方面的思考,思考数据库方面的哪些配置会导致这个问题。 直到最终发现问题的根源,是/etc/hosts的配置导致的。

 

 

昨天另一个朋友,也和我讲了另一个事情,他们有个物化视图,一直无法刷新,表才2G,也不算太大。 但就是刷新不了。 后来也是研究了很长的时间,最后定位出来是防火墙问题,里面有禁止大包的传送,把两边防火墙这个规则去掉就好了。

 

由这个故障的处理过程,我们要反思的是,在我们处理故障时候,不要总是局限在数据库这个层面,可能其他的配置,也会导致这个问题。在故障处理过程中,要想起拓展我们的思维,不要在自己的小巷思维里饶的太久了。


在 Dubbo 客户端连接服务端时出现 `com.alibaba.dubbo.remoting.RemotingException: Connection refused` 异常,通常表明客户端无法与目标服务建立网络连接。该问题可能由多个因素引起,包括网络配置、服务注册信息异常、防火墙限制、协议配置不一致等。 ### 网络连接问题排查 1. **IP 地址和端口检查** 如果日志中显示的 IP 地址(如 `/160.22.2.166:20881`)并非本地配置的地址,可能是服务注册中心(如 Zookeeper、Nacos)中记录的地址有误。这种情况通常发生在服务提供者启动时绑定了错误的网络接口或配置了不正确的 IP 地址。建议在服务提供者的配置文件中明确指定主机地址,例如在 `dubbo.xml` 文件中配置: ```xml <dubbo:protocol name="dubbo" port="${dubbo.port}" host="192.168.51.162" /> ``` 以确保服务暴露在正确的 IP 上 [^2]。 2. **端口监听状态检查** 在服务提供者端,使用以下命令检查指定端口是否处于监听状态: ```bash netstat -tuln | grep 20881 ``` 如果未监听,则服务未正常启动或配置端口有误。需要检查服务启动日志,确认是否因端口冲突或启动异常导致服务未成功注册。 3. **防火墙与安全策略** 检查客户端与服务端之间的防火墙规则,确保端口 20881 是开放的。可以通过临时关闭防火墙进行测试: ```bash systemctl stop firewalld ``` 或者添加允许特定端口的规则。 4. **服务注册一致性验证** 登录注册中心(如 Zookeeper CLI 或 Nacos 控制台),检查服务提供者注册的地址是否正确。如果注册的地址是 `160.22.2.166`,但实际服务运行在 `192.168.51.162`,则需调整服务提供者的网络配置,确保其使用正确的 IP 注册。 5. **DNS 与 Hosts 配置** 若服务通过主机名注册,需确保客户端能够正确解析该主机名,并且 `/etc/hosts` 文件中配置的 IP 地址与实际服务地址一致。 6. **Dubbo 协议兼容性检查** 确保客户端与服务端使用的 Dubbo 版本一致,并且协议配置(如 `dubbo`, `rmi`, `http`)匹配。版本不一致可能导致序列化失败或协议不识别,从而引发连接问题。 7. **超时与重试机制优化** 在客户端配置合理的超时时间与重试策略,有助于在网络短暂异常时自动恢复: ```xml <dubbo:reference id="demoService" interface="com.example.DemoService" timeout="5000" retries="2" /> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值