阿宽

Nothing is more powerful than habit!
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

oracle 錯誤

Posted on 2008-01-04 10:47  宽田  阅读(724)  评论(0编辑  收藏  举报
問題:
    連線都會出現 ORA-12545  連接失敗是因為目標主機或物件不存在

   解:在LISTENER刚启动的时候,数据库还末向LISTENER注册其SERVICE,所以联接并没有通过MTS,而是直接通过TNSNAME上的地址联接到数据库。
等一段时间过后,数据库向LISTENER注册其SERVICE,如果客户端发出联接请求,请求会被LISNTER以一个包的形式返发到客户端(这个包中 就是Dispather的地址),让客户端联接到Dispather上去。由于你的INIT中的MTS_DISPATCHERS参数没有加上IP地址,所 以,DISPATCHERS地址中包含是你的主机全名,如:(ADDRESS=(PROTOCOL=tcp)(HOST= rtcsol1.us.oracle.com)(PORT=59034))而你的客户端由于没有配置DNS(即无法解析rtcsol1.us.oracle.com),所以会报出ORA-12545 错误。

解决方法有以下几种:
1)在你的客户端的HOST文件中注册服务器的IP地址与带域名的机器名全称
    HOST文件路徑:"C:\WINDOWS\system32\drivers\etc"目錄下的Hosts文件,用文本編輯器編加入地址,如:192.168.0.132   sh2
2)将MTS_DISPATCHERS参数中加上HOST=IP地址。使Listener返回的DISPATCHERS地址包中不再使用计算名而改用IP地址。
   MTS_DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.9))(DISPATCHERS=1)"
  
不行的話試一下下邊語句
  
MTS_DISPATCHERS="(ADDRESS=(PROTOCOL=TCP)(HOST=10.0.0.9)(PORT=xxxx))(DISPATCHERS=1)"
3)在INIT中使用LOCAL_LISTENER参数,如
  LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx.xxx)(PORT=xxxx))
  注:8i的话,不需要local_listener这个参数

轉:http://www.itpub.net/21889.html

oracle10g rac 报ora-12545错误的解决方案
一、问题描述
操作系统Windows 2003 ,oracle 10g 10.2.0.2
当客户端连过来时客户端有时能连通,有时却断开提示错误
已连接。
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 node2-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://tolywang.itpub.net/post/48/435333