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数据库常见问题及解决方案

    简析Oracle数据库常见问题及解决方案

    这篇文章主要介绍了Oracle数据库常见问题及解决方案,总结了一些在Oracle数据库使用过程中的常见问题,并对其进行了分析,给出了解决方案,需要的朋友可以参考下
    2015-08-08
  • Oracle中的触发器trigger

    Oracle中的触发器trigger

    这篇文章介绍了Oracle中的触发器trigger,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • 直接拷贝数据文件实现Oracle数据迁移

    直接拷贝数据文件实现Oracle数据迁移

    Oracle 数据迁移是比较麻烦的,对菜鸟来说更是如此。最近由于更换服务器,需要将Oracle迁移到另外一台机器,在两个服务器环境相同,以及 Oracle版本相同的前提下,通过直接拷贝数据文件到新服务器,就可以直接迁移成功。这里记录一下迁移步骤。需要的朋友可以参考。
    2017-01-01
  • Oracle开发之分析函数简介Over用法

    Oracle开发之分析函数简介Over用法

    本文主要是对Oracle分析函数概念的简单介绍,同时讲解了Over函数的用法,希望对大家学习分析函数有所帮助。
    2016-05-05
  • Oracle SQL语句实现数字四舍五入取整

    Oracle SQL语句实现数字四舍五入取整

    本文介绍Oracle中一些对数字的常用操作,包括向上向下去整、四舍五入、保留N位小数等操作,希望对大家有所帮助。
    2016-05-05
  • Linux下的Oracle启动脚本及其开机自启动

    Linux下的Oracle启动脚本及其开机自启动

    这篇文章主要介绍了Linux下的Oracle启动脚本及其开机自启动的方法,大家可以参考使用
    2013-11-11
  • Oracle Exadata存储节点主动替换磁盘的操作步骤

    Oracle Exadata存储节点主动替换磁盘的操作步骤

    本文讨论Exadata存储节点主动更换磁盘的适用场景及操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2025-07-07
  • Oracle中用户密码过期修改为不限制的具体步骤

    Oracle中用户密码过期修改为不限制的具体步骤

    要在 Oracle 数据库中修改用户的密码过期设置,使其不限制密码过期,可以调整用户所关联的 Profile,本文通过代码示例给大家介绍的非常详细,需要的朋友可以参考下
    2025-12-12
  • Oracle10g通过DBLink访问MySQL示例

    Oracle10g通过DBLink访问MySQL示例

    本文介绍了Oracle访问MySQL的方法,测试环境:CentOS5_X64, Oracle10g_X64, MySQL5 。大家参考使用吧
    2014-01-01
  • Oracle修改端口号之后无法启动的解决方案

    Oracle修改端口号之后无法启动的解决方案

    Oracle数据库更改端口后出现监听器无法启动的问题确实较为常见,但并非必然发生,这一问题通常源于​​配置错误或环境冲突​​,而非端口修改本身,以下是系统性解决方案,需要的朋友可以参考下
    2025-06-06

最新评论