使用scanip连接DB_LINK报错ORA-12545解决
客户反应,使用DB_LINK报错ORA-12545: Connect failed because target host or object does not exist
思路:
1、检查源端监听是否正常
2、检查目标端TNS配置
使用TNSPING是否通...
3、查看DB_LINK定义是否正确,使用的TNS文件是否对
select * from dba_db_links;
4、网络是否正常
排错:
1、源端监听正常,数据库正常
2、目标端TNS配置无误,TNSPING可通,但是sqlplus 命令不通,说明还是有问题
3、DB_LINK定义正确...
4、网络ping正常
5、使用不是SCANIP的IP(VIP或者主机IP)配置TNS连接DB_LINK
定位:
1、使用不是SCANIP的IP(VIP或者主机IP)配置TNS连接DB_LINK,发现可以使用DB_LINK连接查询,从中问题定位还是在源端,无法辨别SCANIP这个IP,而ORACLE是通过域名解析IP,尝试使用SCANIP域名配置TNS,但是直接TNsping通不过...此路不通
2、查找相关资料,发现一个参数local_listener,
LOCAL_LISTENER指定解析为Oracle Net本地侦听器(即与此实例在同一台计算机上运行的侦听器)的地址或地址列表的网络名称。地址或地址列表在TNSNAMES.ORA文件或其他地址存储库中为您的系统配置
大概意思是可以把配置中的IP或者域名直接转成数据库服务器系统配置,这样访问该配置中的IP或者域名相当于访问主机了...
但是有一点需要注意:客户端通过SCANIP或者VIP都可以连接到RAC数据库库-
-我这里就是修改为VIP的IP。--其实应该修改为SCANIP,客户端统一使用SCANIP来连接,但是HOST主机参数为scanip地址,则修改完参数后,scanip能够正常使用,但如果有客户端配置使用vip的话,连接时则会出现错误:ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。
所以将其修改成VIP,这里需要注意的是RAC两个节点都修改注册一下该参数
3、具体步骤
查看该参数
SQL> show parameter local_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string
log_archive_local_first boolean TRUE
修改为两个节点为SCANIP,DB_LINK此时为可用
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.188.100)(PORT=1521))))' sid='*';
System altered.
SQL> show parameter local_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
local_listener string (DESCRIPTION=(ADDRESS_LIST=(AD
DRESS=(PROTOCOL=TCP)(HOST=192.
168.188.100)(PORT=1521))))
log_archive_local_first boolean TRUE
SQL> show parameter remote_
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_dependencies_mode string TIMESTAMP
remote_listener string 192.168.188.100:1521
remote_login_passwordfile string EXCLUSIVE
remote_os_authent boolean FALSE
remote_os_roles boolean FALSE
result_cache_remote_expiration integer 0
--注册
SQL> alter system register;
System altered.
--正如上面所说最好修改成VIP,
一节点: 修改过后DB_LINK仍可用...
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.188.201)(PORT=1521))))' sid='ecology1';
System altered.
SQL> alter system register;
System altered.
二节点:
SQL> alter system set local_listener='(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.188.202)(PORT=1521))))' sid='ecology2';
SQL> alter system register;
System altered.
另一种解决方案:TNS Failover配置使用VIP也是可以的
RAC =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.188.201)(PORT = 1521))
(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.188.201)(PORT = 1521))
(LOAD_BALANCE = ON)
(FAILOVER = ON)
)
(CONNECT_DATA =
(SERVICE_NAME = ecologya)
(FAILOVER_MODE =
(TYPE = select)
(METHOD = basic)
(RETRIES = 10)
(DELAY = 1)
)
)
)
至此该问题解决完毕……………..
版权声明:本文为博主原创文章,未经博主允许不得转载。



