本文共 2013 字,大约阅读时间需要 6 分钟。
一、问题描述 操作系统Windows 2003 ,oracle 10g 10.2.0.2 当客户端连过来时客户端有时能连通,有时却断开提示错误 SQL> conn system/oracle@gzmdc 已连接。 SQL> conn system/oracle@gzmdc ERROR: ORA-12545: 因目标主机或对象不存在,连接失败 警告: 您不再连接到 ORACLE。 SQL> conn system/oracle@gzmdc 已连接。 SQL> conn system/oracle@gzmdc 已连接。 SQL> conn system/oracle@gzmdc ERROR: ORA-12545: 因目标主机或对象不存在,连接失败 警告: 您不再连接到 ORACLE。 SQL> 客户端tns配置 GZMDC= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.18)(PORT = 5880)) (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.20)(PORT = 5880)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = test) ) ) 服务器端 201.150.14.18 node1-vip 201.150.14.20 node1-vip 是虚拟ip(vip) 201.150.14.5 node1 201.150.14.7 node2 是公网ip 二、解决方案 有人提议把客户端hosts文件中加入对两个服务名的名字解析,经测试的确能解决问题,但总觉得不是很好,维护上百台电脑的hosts文件是很困难的. 下面的方法是我测试成功的. 1, 服务器2个节点群集 机器名为 node1,node2. 2,在服务器端用system用户登录 SQL> show parameter list NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ local_listener string remote_listener string LISTENERS_TEST 可以看到这两个参数,remote_listener为 LISTENERS_TEST 3,在node1,node2上分别编辑服务器端tnsname.ora (注意,是服务器端的) 将下面部分 LISTENERS_TEST = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 5880)) (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 5880)) ) 改为: LISTENERS_TEST = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.18)(PORT = 5880)) (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.20)(PORT = 5880)) ) 也就是将host主机名改为ip地址 在node1上增加以下部分 LOCAL_TEST = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.5)(PORT = 5880)) ) 在node2上增加以下部分 LOCAL_TEST = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 201.150.14.7)(PORT = 5880)) ) 保存退出 查看两个节点的 listener.ora文件,最好将里面的主机名都改为ip地址 4,用system用户登录 执行 alter system set local_listener=''LOCAL_TEST'' scope=both; 5 重启所有实例 所有监听. 再从客户端连接 正常, 每次连接用 show parameter instance_name查看实例名, 负载均衡已经生效. 有人把remote_listener 参数置空 虽然连接正常但已经破坏了负载均衡. 以上做法不知道是不是有什么不妥. 、 转载: http://dev.firnow.com/course/7_databases/oracle/oraclejs/20071226/95494.html