TNS经常给IT管理员带来麻烦,而且很难定位。尤其是在Oracle数据库中。下面将介绍如何避免这些常见错误。
在连接Oracle数据库的时候,我经常会遇到一些常见的TNS错误
话虽如此,下面我会解释用户的tnsname.ora配置文件与数据库侦听器配置的关系。一旦熟悉了这种关系,我们就可以很容易地修复常见的Oracle TNS错误。
众所周知,TNS是Transparent Network Substrate的缩写,Oracle将其称为其网络堆栈SQL*Net的一部分。当然,现在该网络堆栈被称为Oracle Net,但TNS的缩写仍然沿用至今。
在工作站上安装OracleClient软件后,一般来说,下一个操作是在ORACLE_HOME /network/ admin / tnsnames.ora配置文件新增一条记录。这个记录只是一个别名,它定义了连接到Oracle数据库的所有相关信息。下面是该条记录的一个例子:
ORCLDB =
(DESCRIPTION=
(ADDRESS_LIST =
(ADDRESS = (COMMUNITY = TCP)(PROTOCOL = TCP)
(Host = myhost01)(Port = 1521)))
(CONNECT_DATA = (SERVICE_NAME = orcl))
)
上面设置的别名是ORCLDB。这里我们可以设置任何我们想要的别名,这个别名是为你的应用服务的,Oracle数据库从不使用这个别名。应用程序会说“连接到ORCLDB”,Oracle客户端软件将查看tnsnames.ora文件,寻找关于该别名的细节。别名定义了使用的协议、传输控制协议(TCP)、数据库所在的主机(myhost)、侦听器端口(1521)和数据库的服务名称(orcl)。
现在,让我们看看数据库服务器的侦听器是如何配置的。在数据库服务器上,我发布了“lsnrctl服务”。
[oracle@myhost01 ~]$ lsnrctl services
LSNRCTL for Linux: Version 12.1.0.2.0 – Production on 18-JUL-2017 10:40:33
Copyright (c) 1991, 2014, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
Services Summary…
Service “orcl.acme.com” has 1 instance(s).
Instance “orcl”, status READY, has 1 handler(s) for this service…
Handler(s):
“DEDICATED” established:10077 refused:0 state:ready
LOCAL SERVER
上面的例子中,我们可以看到,它为TCP配置了监听器。Host项是空的,表示其实际值是当前的数据库主机。端口为1521,服务名是orcl . acme.com。
当我们在tnsnames.ora配置文件中设置了有错误的别名,主机名、协议、端口和服务名称时,就会出现Oracle TNS错误。例如,我将使用SQL * Plus连接到orcldb别名定义的数据库。我收到了ora – 12514错误。(附注:本文中的错误也可以有TNS前缀。因此,您可能会看到TNS – 12514,也会出现ORA – 12514错误。前缀由发出错误的Oracle代码决定。
C:\>sqlplus peasland@orcldb
SQL*Plus: Release 11.2.0.4.0 Production on Tue Jul 18 10:43:30 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter password:
ERROR:
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
上面的错误显示,监听器不知道我们的服务名称。在tnsnames.ora文件中,服务名称被定义为orcl。正如我们在“ lsnrctl服务”输出中看到的那样,侦听器知道名为orcl . acme.com的服务。服务不匹配。侦听器有附加到服务的域名,以及tnsname.ora别名却没有。上述问题的解决方案很简单,在tnsnames.ora中添加域名。
(CONNECT_DATA = (SERVICE_NAME = orcl.acme.com))
在ORA- 12514错误中,Oracle客户端软件可以通过匹配的协议在指定端口上与侦听器联系,但是侦听器与最终的信息——服务名称不匹配。在下一个例子中,我们遇到另一个的问题。
C:\>sqlplus peasland@orcldb
SQL*Plus: Release 11.2.0.4.0 Production on Tue Jul 18 10:49:16 2017
Copyright (c) 1982, 2013, Oracle. All rights reserved.
Enter password:
ERROR:
ORA-12545: Connect failed because target host or object does not exist
在这里,ORA – 12545告诉我们,侦听器连接失败。在这种情况下,是因为主机和/或端口不正确。我之所以遇到这个错误,是因为我的别名中有以下内容: (Host = myhsot)
主机名不正确。当我在别名中修改成正确主机名时,连接成功。如果遇到ORA- 12545错误(TNS – 12545),请检查主机和端口。
如果协议在别名定义中不正确,则可能会收到以下错误:
ORA- 12538: TNS: 不存在对应的协议适配器
解决办法是使用正确的协议,通常使用的协议是TCP。
总结一下,每当我收到Oracle TNS错误时,我都会去查看tnsnames.ora配置文件别名设置的细节。我会查看监听器的定义。如果我接收TNS(ORA)- 12514错误,我就会知道知道是服务名不匹配的问题。如果我接收TNS(ORA)- 12545错误,我知道主机/端口组合不正确。如果我接收TNS(ORA)- 12538错误,说明我配置的协议是无效的。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国