Oracle-客户端连接报错ORA-12545问题

2023-11-23 13:44

本文主要是介绍Oracle-客户端连接报错ORA-12545问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题背景:

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

 

aff3937f29c256ad5ac0b58ac6ed561e.png

问题分析:

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

 

69136b021cbb425187a0493553978aa1.png

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

 

232033929fe40e7805eee3f78bdaf7a0.png

        接下来,获取客户端连接报错的具体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))

e1745f66973a8f01b8e44c40c38f5958.png

        该地址是客户端在连接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地址解析

4a66e8d0b540d8f53c1335d8c05b9a7f.png

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

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

 

dbc28c6e06e5b5ac5775ec7346b8ef3f.png

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

 

c5e0a138931dab612a27ad1babf0c4e4.png

问题解决:

        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问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/418352

相关文章

oracle 11g导入\导出(expdp impdp)之导入过程

《oracle11g导入导出(expdpimpdp)之导入过程》导出需使用SEC.DMP格式,无分号;建立expdir目录(E:/exp)并确保存在;导入在cmd下执行,需sys用户权限;若需修... 目录准备文件导入(impdp)1、建立directory2、导入语句 3、更改密码总结上一个环节,我们讲了

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

MySQ中出现幻读问题的解决过程

《MySQ中出现幻读问题的解决过程》文章解析MySQLInnoDB通过MVCC与间隙锁机制在可重复读隔离级别下解决幻读,确保事务一致性,同时指出性能影响及乐观锁等替代方案,帮助开发者优化数据库应用... 目录一、幻读的准确定义与核心特征幻读 vs 不可重复读二、mysql隔离级别深度解析各隔离级别的实现差异