厦门双模网站,wordpress同步微博评论,网上书城网站开发,给您更优质的服务体验问题背景: 用户在客户端服务器通过sqlplus通过scan ip登陆访问数据库时#xff0c;偶尔会出现连接报错ORA-12545: Connect failed because target host or object does not exist的情况。 问题分析#xff1a; 首先#xff0c;登陆到连接有问题的客户端数据库上#xff0c;…问题背景: 用户在客户端服务器通过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_CLIENT16
TRACE_DIRECTORY_CLIENT/tmp
TRACE_UNIQUE_CLIENTON
DIAG_ADR_ENABLED OFF 配置完跟踪参数之后再一次通过sqlplus连接scan ip访问数据库每一次登陆都会在/tmp目录下面生成登陆的跟踪trc文件cli_xxxx.trc ,打开发生ORA-12545:报错时的trc文件 从trc文件里面我们看到了发生解析主机错误(hostname lookup failure!)的主机连接地址nsc2addr: (ADDRESS(PROTOCOLTCP)(HOSTservicedb2)(PORT1521)) 该地址是客户端在连接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)地址的连接信息都是直接的服务器主机名hostservicedb1以及(hostservicedb2),不是实际的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 (PROTOCOLTCP)(HOSTxxx.xxx.xxx.13)(PORT1521)),
节点二:(ADDRESS (PROTOCOLTCP)(HOSTxxx.xxx.xxx.74)(PORT1521))
这样返回给客户端的是IP的形式而非主机名全部客户端就可以不用配置hosts或者dns去解析数据库服务器的主机名