Oracle客户端连接报错ORA-12545问题的解决办法

 更新时间:2024年03月11日 08:30:15   作者:牛牛的笔记  
这篇文章主要给大家介绍了关于Oracle客户端连接报错ORA-12545问题的解决办法,ora12545因目标主机或对象不存在,连接失败,文中通过图文将解决的办法介绍的非常详细,需要的朋友可以参考下

问题背景:

用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时,偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。

问题分析:

首先,登陆到连接有问题的客户端数据库上,通过sqlplus进行多次连接测试,的确会出现用户所说的ORA-12545: Connect failed because target host or object does not exist报错现象,此外,还发现登陆成功的节点显示的实例都是节点一实例servicedb1

检查数据库的listener_scan监听配置,服务servicedb下动态注册了(ready)两个实例servicedb1以及servicedb2,没有其他的配置实例

接下来,获取客户端连接报错的具体trace信息,需要在客户端的服务器的sqlnet.ora里面配置跟踪参数,对客户端的连接过程进行跟踪

TRACE_LEVEL_CLIENT=16
TRACE_DIRECTORY_CLIENT=/tmp   
TRACE_UNIQUE_CLIENT=ON
DIAG_ADR_ENABLED =OFF   

配置完跟踪参数之后,再一次通过sqlplus连接scan ip访问数据库,每一次登陆都会在/tmp目录下面生成登陆的跟踪trc文件cli_xxxx.trc ,打开发生ORA-12545:报错时的trc文件

从trc文件里面,我们看到了发生解析主机错误(hostname lookup failure!)的主机连接地址nsc2addr: (ADDRESS=(PROTOCOL=TCP)(HOST=servicedb2)(PORT=1521))

该地址是客户端在连接scan监听之后,返回给客户端的本地监听服务连接地址,因为scan 监听上的服务是数据库通过远程注册进去的(remote listener),客户端在连接scan监听上的服务之后,scan监听会再把负载较小节点所在的本地监听(local listener)地址返回给客户端,客户端再访问这个监听地址去连接数据库

从这个返回报错地址nsc2addr我们可以看到里面的地址信息host返回的是主机名而不是实际的IP地址,查看客户端的/etc/hosts配置,可以看到只配置了节点一的主机名IP地址解析,并没有配置节点二的主机名IP地址解析,也没有配置dns去解析这个主机名,从而导致一旦scan 监听分配到节点二给客户端时就会出现了ORA-12545: Connect failed because target host or object does not exist的报错,而分配到节点一客户端可以连接成功,因为hosts里面有节点一的主机名IP地址解析

接下来继续分析scan监听返回的地址信息host为主机名的原因,查看数据库的scan监听的服务配置信息lsnrctl services listener_scan1

可以看到scan监听下的服务servicedb注册的实例servicedb1,servicedb2的远程服务(remote server)地址的连接信息都是直接的服务器主机名(host=servicedb1)以及(host=servicedb2),不是实际的IP地址信息,这也是为什么客户端接收到的地址nsc2addr里面不是IP地址信息的原因,因为数据库注册到scan监听服务的连接信息是主机名形式

show parameter查看数据库的动态注册配置参数local listener,该参数表示实例节点所注册的本地监听地址,数据库远程注册到scan监听的服务会指向这个地址,我们可以看到由于参数local_listener的配置为空,因此数据库注册到scan监听服务的连接信息host就是默认的服务器主机名

问题解决:

1 临时解决方案,客户端的/etc/hosts里面配置数据库节点二主机的IP解析条目,需要注意的是,这个方式只是解决了该客户端的访问数据库的问题,如果其他客户端没有配置hosts或者dns去解析数据库服务器的主机名,依然会出现ORA-12545: Connect failed because target host or object does not exist的情况

2 完整解决方案,数据库两个节点动态注册参数local_listener配置为两个节点的VIP连接信息

节点一:(ADDRESS = (PROTOCOL=TCP)(HOST=xxx.xxx.xxx.13)(PORT=1521)),

节点二:(ADDRESS = (PROTOCOL=TCP)(HOST=xxx.xxx.xxx.74)(PORT=1521))

这样返回给客户端的是IP的形式而非主机名,全部客户端就可以不用配置hosts或者dns去解析数据库服务器的主机名

总结

到此这篇关于Oracle客户端连接报错ORA-12545问题的解决办法的文章就介绍到这了,更多相关Oracle客户端连接报错ORA-12545内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    Oracle 分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法

    Oracle分析函数RANK(),ROW_NUMBER(),LAG()等的使用方法,需要的朋友可以参考下。
    2009-11-11
  • Oracle数据库中对null值的排序及mull与空字符串的区别

    Oracle数据库中对null值的排序及mull与空字符串的区别

    这篇文章主要介绍了Oracle数据库中对Null值的排序及Null与空字符串的区别,讲解了在order by排序中如何定义null值项的位置及其与字符串' '的不同,需要的朋友可以参考下
    2016-03-03
  • Oracle 触发器trigger使用案例

    Oracle 触发器trigger使用案例

    Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器,触发器分为语句级触发器和行级触发器,本文通过案例给大家介绍触发器使用,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • Linux系统下Oracle数据库监听启动关闭命令详解

    Linux系统下Oracle数据库监听启动关闭命令详解

    现在很多朋友在学习linux下oracle 数据库的时候可能都发现了一个问题,oracle数据库的服务不能自动启动,这篇文章主要给大家介绍了关于Linux系统下Oracle数据库监听启动关闭命令的相关资料,需要的朋友可以参考下
    2024-01-01
  • Oracle function函数返回结果集的3种方法

    Oracle function函数返回结果集的3种方法

    工作中常需要经过一段复杂逻辑处理后,得出的一个结果集,所以这篇文章主要给大家介绍了关于Oracle function函数返回结果集的3种方法,需要的朋友可以参考下
    2023-07-07
  • ORACLE中如何找到未提交事务的SQL语句详解

    ORACLE中如何找到未提交事务的SQL语句详解

    这篇文章主要给大家介绍了关于ORACLE中如何找到未提交事务的SQL语句,文中通过示例代码介绍的非常详细,对大家学习或者使用ORACLE具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • Oracle 中XML处理函数介绍

    Oracle 中XML处理函数介绍

    本文主要介绍Oracle中XML函数的基本使用方法,希望对大家有所帮助。
    2016-05-05
  • Oracle SQL性能优化系列学习二

    Oracle SQL性能优化系列学习二

    Oracle SQL性能优化系列学习二...
    2007-03-03
  • ORACLE中的的HINT详解

    ORACLE中的的HINT详解

    本篇文章主要介绍了ORACLE中的的HINT详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Drop、Delete与Trunc的区别和应用方式

    Drop、Delete与Trunc的区别和应用方式

    这篇文章主要介绍了Drop、Delete与Trunc的区别和应用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论