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

问题背景:

用户在客户端服务器通过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去解析数据库服务器的主机名

相关推荐
虚拟网络工程师8 分钟前
【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)
运维·服务器·网络·数据库·mariadb
BLEACH-heiqiyihu11 分钟前
RedHat7—Linux中kickstart自动安装脚本制作
linux·运维·服务器
福如意如我心意16 分钟前
PostGres命令【常用维护,增删改查】
数据库·postgresql·psql
袁庭新28 分钟前
Cannal实现MySQL主从同步环境搭建
java·数据库·mysql·计算机·java程序员·袁庭新
爱学习的白杨树44 分钟前
MySQL中有哪几种锁?
数据库·mysql
007php0071 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
晴天飛 雪1 小时前
Grafana监控PostgreSQL
数据库·postgresql·grafana
斗-匕1 小时前
Spring事务管理
数据库·spring·oracle
一行玩python1 小时前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
MXsoft6182 小时前
华为服务器(iBMC)硬件监控指标解读
大数据·运维·数据库