Oracle - 我正在使用哪个TNS Names文件?

60
有时我会遇到Oracle连接问题,因为我无法确定我的数据库客户端正在使用哪个tnsnames.ora文件。
有什么最好的方法可以解决这个问题?++对各种平台解决方案感到高兴。
11个回答

87

Oracle提供了一个名为tnsping的工具:

R:\>tnsping someconnection

TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:38:07

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora

TNS-03505: Failed to resolve name

R:\>


R:\>tnsping entpr01

TNS Ping Utility for 32-bit Windows: Version 9.0.1.3.1 - Production on 27-AUG-20
08 10:39:22

Copyright (c) 1997 Oracle Corporation.  All rights reserved.

Used parameter files:
C:\Oracle92\network\ADMIN\sqlnet.ora
C:\Oracle92\network\ADMIN\tnsnames.ora

Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (COMMUNITY = **)
 (PROTOCOL = TCP) (Host = ****) (Port = 1521))) (CONNECT_DATA = (SID = ENTPR0
1)))
OK (40 msec)

R:\>

这应该显示你正在使用哪个文件。该实用程序位于Oracle的bin目录中。


22

对于 Linux:

$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'open.*tnsnames.ora'

显示类似于这样:

open("/opt/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora",O_RDONLY)=7

更改为

$ strace sqlplus -L scott/tiger@orcl 2>&1| grep -i 'tnsnames.ora'

将显示所有失败的文件路径。


1
谢谢,根据这个看来,/etc/tnsnames.ora 是一个可靠的、全局的 TNS 名称位置。 - Avindra Goolcharan
@AvindraGoolcharan,这也是我的结论。我们把它放在那里,没有出现任何问题。 - Mark Harrison

5
在我的开发机上,我安装了三个不同版本的 Oracle 客户端软件。其中一个版本我管理 tnsnames.ora 文件。在另外两个版本中,我已经输入了 tnsnames.ora 文件内容。
ifile=path_to_tnsnames.ora_file/tnsnames.ora

这样,如果客户端因某些原因使用了错误的 tnsnames.ora 文件,它将始终最终指向最新版本。


5

在另一个位置存储了TNS的位置:如果您使用的是Windows系统,请打开regedit并导航到我的 HKEY 本地机器/软件/ORACLE/KEY_OraClient10_home1,其中KEY_OraClient10_home1代表您的Oracle主目录。如果有一个名为TNS_ADMIN的字符串条目,则该条目的值将指向计算机上Oracle正在使用的TNS文件。


4

Codeslave问:“$ ORACLE_HOME/network/admin/tnsnames.ora”不应该总是这样吗?答案是否定的。考虑在同一台机器上运行tnsping的这两个调用:

C:\Documents and Settings\me>D:\Oracle\10.2.0_DB\BIN\tnsping orcl

TNS Ping Utility for 32-bit Windows: Version 10.2.0.4.0 - Production on 09-OCT-2
008 14:30:12

Copyright (c) 1997,  2007, Oracle.  All rights reserved.

Used parameter files:
D:\Oracle\10.2.0_DB\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = xxxx
)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL)))

OK (40 msec)

C:\Documents and Settings\me>tnsping orcl

TNS Ping Utility for 32-bit Windows: Version 10.2.0.1.0 - Production on 09-OCT-2
008 14:30:21

Copyright (c) 1997, 2005, Oracle.  All rights reserved.

Used parameter files:
D:\oracle\10.2.0_Client\network\admin\sqlnet.ora


Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)
(HOST = XXXX)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = ORCL)))
OK (20 msec)

C:\Documents and Settings\me>

请注意两个不同的参数文件位置,这取决于您正在运行哪个tnsping可执行文件(以及它可能从哪里运行)。对于基于tnsnames的Oracle网络,使用TNS_ADMIN变量是确保获取一致的tnsnames.ora文件的唯一方法。(注意:这是针对Windows的答案)

3
你不是很喜欢使用多个 Oracle 主目录吗? - stjohnroe
这个答案已经有很多人点赞了。我已经好几年没遇到过这个问题了。TNS_ADMIN 环境变量是关键。对于 PowerShell,它是 $env:TNS_Admin。对于 C#,是 Environment.GetEnvironmentVariable("TNS_Admin") - Greg Burghardt

4

对于Windows系统:从SysInternals下载的Filemon可以展示给你正在被访问的文件。

记得设置筛选器以避免被过多的文件系统流量所淹没。

Filter Dialog

补充:由于Filemon已不能与较新版本的Windows系统兼容,因此您可能需要使用Process Monitor代替。


2
默认情况下,tnsnames.ora位于UNIX操作系统上的$ORACLE_HOME/network/admin目录中,在Windows操作系统上则位于ORACLE_HOME\network\admin目录中。tnsnames.ora也可以存储在以下位置:
由TNS_ADMIN环境变量(或注册表值)指定的目录
在UNIX操作系统上,全局配置目录。例如,在Solaris操作系统上,此目录为/var/opt/oracle。
如果您有多个ORACLE_HOMES,请注意使用的是哪一个,因为tnsnames.ora文件的位置可能因ORACLE_HOME不同而变化。
对于提到TWO_TASK环境变量的人,它用于设置要连接的默认数据库服务名称(可以是另一台服务器上的数据库)。然后,你连接时会在tnsnames.ora文件中查找设置为TWO_TASK的服务名称。

1

strace sqlplus -L scott/tiger@orcl 帮助查找 /home/oracle 上的 .tnsnames.ora 文件,以便找到它所取代的 $ORACLE_HOME/network/admin/tnsnames.ora 文件。感谢发布。


1
这不是针对你问题的直接回答,但我自己也曾经非常沮丧地尝试找到并更新所有tnsnames文件,因为我有几个Oracle安装程序:客户端、BI工具、OWB等,每个都有自己的Oracle主目录。最终,我创建了一个名为TNSNamesSync的实用程序,它将更新所有Oracle主目录中的所有tnsnames。它在MIT许可证下发布,可以在此处免费使用https://github.com/artybug/TNSNamesSync/releases 文档在这里:https://github.com/artchik/TNSNamesSync/blob/master/README.md 这仅适用于Windows。

1

它不应该总是是"$ORACLE_HOME/network/admin/tnsnames.ora"吗? 然后你可以只需执行 "echo $oracle_home"或相当于*nix的命令。

@Pete Holberton 您完全正确。这使我想起来,还有另一个名为TWO_TASK的问题。

根据http://www.orafaq.com/wiki/TNS_ADMIN
TNS_ADMIN是一个环境变量,指向SQL*Net配置文件(如sqlnet.ora和tnsnames.ora)所在的目录。


2
实际上,不,你不能假设这个位置。有代理主机和客户端主机,仅举两个例子,它们都有自己的网络/管理目录。你得到的答案取决于你运行哪个可执行文件。 - DCookie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接