在使用客户端通过SCNAIP连接11G RAC数据库的过程中,ORA-12545是最为常见的连接类报错之一,很多用户在遇到该问题时往往不知道从何下手排查。下面我们先明确问题背景,再逐步给出完整的解决思路。

ORA-12545报错的核心原因
ORA-12545报错的全称是ORA-12545: 连接失败,因为目标主机或对象不存在,在11G RAC场景下,该报错通常和以下几个因素相关:
- SCNAIP对应的VIP地址在客户端侧无法解析或网络不通
- RAC节点的本地监听没有正确注册SCNAIP对应的服务
- 客户端tnsnames.ora配置中的连接地址和SCNAIP不匹配
- RAC节点的
local_listener参数配置错误,导致服务无法正确发布
分步排查与解决方法
第一步:校验SCNAIP与VIP的网络连通性
首先确认SCNAIP对应的VIP地址在客户端侧是否可以正常访问,在客户端机器上执行以下命令测试网络连通性:
# 替换为实际的SCNAIP对应的VIP地址和监听端口,默认1521 ping 192.168.1.100 telnet 192.168.1.100 1521
如果ping不通或者telnet端口失败,需要先排查网络层面的问题,比如防火墙是否拦截了端口、VIP是否在对应节点上正常飘移。
第二步:检查RAC节点监听状态
登录到RAC的每个节点,使用lsnrctl命令查看监听状态,确认SCNAIP对应的服务是否已经注册:
# 查看监听状态 lsnrctl status # 查看监听注册的服务列表 lsnrctl services
如果services列表中没有你要连接的数据库服务名,说明监听没有正确注册服务,需要检查local_listener参数配置。
第三步:调整节点local_listener参数
登录数据库实例,查看当前local_listener的配置:
-- 查看local_listener参数 show parameter local_listener;
如果参数值没有包含SCNAIP对应的VIP和端口,需要手动修改,每个节点执行对应配置:
-- 替换为实际的VIP地址、端口和实例名,每个节点配置自己的VIP alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=1521))' scope=both sid='orcl1'; -- 注册服务 alter system register;
第四步:修正客户端tnsnames.ora配置
客户端侧的tnsnames.ora需要正确配置SCNAIP的连接信息,示例配置如下:
ORCL_RAC =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)注意HOST部分要填写SCNAIP对应的所有VIP地址,SERVICE_NAME要和数据库发布的服务名一致。
验证解决效果
完成以上配置后,重新在客户端发起连接测试:
# 使用sqlplus测试连接,替换为实际的用户名、密码和服务名 sqlplus test_user/test_pass@ORCL_RAC
如果可以正常登录数据库,说明ORA-12545报错已经解决。如果仍然报错,可以开启客户端和服务器端的监听跟踪,查看更详细的连接失败日志定位问题。
注意事项
修改RAC参数时建议逐个节点操作,避免同时修改导致集群服务异常。如果是生产环境,操作前最好先备份相关配置文件,确认变更影响范围后再执行。