分类: Oracle
2012-04-30 17:46:32
最近,在安装数据库时遇到了不少问题,其中就有:TNS-12545 Connect failed because target host or object does not exist(因目标主机或对象不存在,连接失败),很明显,系统在通过TNS进行连接的时候,无法通过tnsnames.ora这个文件进行解析,网上查阅了很多相关资料,有人说是tnsname.ora没有,或配置错误么?答案是:不一定是配置错误!而且明明有时候通过PL/SQL去登录数据库完全没有问题,但当换了一台客户机,也通过同样的tnsname.ora去连接数据库,就报TNS-12545错误,这是为什么呢?
而我本人遇到的问题则更加诡异,用SecureCRT连接到系统,能通过命令conn “sys/oracle@orcl as sysdba”进入到SQL>(证明tnsnames.ora这个时候是起作用的,也没有配置错误,否则是会报其他TNS错误的,如TNS-12514或TNS-12154),但当我使用PL/SQL DEVELOPER登录数据库时,问题就出现了,报ORA-12545错误,而tnsnames.ora是从linux系统中拷贝过去,用的是同一个文件,但SecureCRT就可以登录,为什么到了PL/SQL DEVELOPER这就卡壳了呢?而我之前配置过的另一台虚拟机就两边都可以正常登陆到数据库。百思不得其解,也问了很多人,依然没有找到解决方法。
后来,依旧借助google,搜索可能出现这一问题原因,有人提出修改本地主机HOSTS文件的方法,于是我尝试了一下,修改C:\WINDOWS\system32\drivers\etc\hosts文件,在末尾加入linux主机的IP地址和主机名,保存退出。然后再次用PL/SQL DEVELOPER连接数据库,问题解决,不报错直接连上数据库。
下面我来分析一下出现这一问题的原因,其实后来我才发现:原来出问题的这台在配置tnsnames.ora文件时使用了主机名,如
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = RHEL5)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
而另外一台没有出问题的tnsnames.ora文件配置的是IP地址,如
ORCL10G =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.20)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl10g)
)
)
大家有没有看出不同?其实已经很明显了,用了IP地址那台(SID=ORCL10G)并没有通过修改真实机的HOST也可以使用PL/SQL登陆,因为此处有了IP地址,而用了主机那台(SID=ORCL),也就是出问题的那台,并没有配置IP地址,这就是造成我们之前碰到的ORA-12545错误的关键。
知道了问题原因,那解决起来也就简单了,有2种方法:
方法一:把出问题的那台(SID=ORCL)的tnsnames.ora里的HOST部分改成用IP地址来命名,这样就无需在在真实机的HOSTS文件中加入虚拟机的IP地址或主机名了。
方法二:如果不想把出问题的虚拟机中tnsnames.ora的HOST部分改成IP,那就必须要修改真实的HOSTS文件,在其中加入虚拟机的IP地址和主机名。
至于tnsnames.ora中到底是用IP地址好,还是用主机名好,我想这个可能还是有点区别的吧,如果为了方便,那就直接把它写成IP地址吧,毕竟写成主机名的话,要通过修改真实机的HOSTS文件才能连上数据库,而且如果更换了不同的客户端来登录数据库的时候,还要修改每台客户机上的HOSTS文件,那是非常麻烦的一件事情。
PS:很多问题,看似很难,难道无法解决,但其实只要静下心来,借助google等搜索工具,还是能找到一点启发的,借鉴别人的方法,再通过自己的实验,如果能把问题解决掉,那此刻的成就感是不言而喻的,留下的印象也是非常深刻的。希望能抛砖引玉,让大家养成一个良好的学习知识和解决问题习惯。