Oracle – 我正在使用什么TNS名称文件?

有时我得到Oracle连接问题,因为我不知道我的数据库客户端正在使用哪个tnsnames.ora文件。

解决这个问题的最好方法是什么? ++很高兴为各种平台解决scheme。

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目录中。

对于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' 

将显示所有失败的文件path。

还有另外一个存储TNS位置的地方:如果你使用Windows,打开regedit并导航到My HKEY Local Machine/Software/ORACLE/KEY_OraClient10_home1 ,其中KEY_OraClient10_home1是你的Oracle主页。 如果存在名为TNS_ADMIN的string条目,则该条目的值将指向Oracle在您的计算机上使用的TNS文件。

对于Windows: SysInternals的Filemon将显示正在访问什么文件。

请记住设置您的filter,以免被繁琐的文件系统stream量所淹没。

过滤器对话框

补充: Filemon不适用于较新的Windows版本,因此您可能需要使用Process Monitor 。

在我的开发机器上,我有三种不同版本的Oracle客户端软件。 我pipe理其中的一个tnsnames.ora文件。 在另外两个,我已经进入了tnsnames.ora文件:

 ifile=path_to_tnsnames.ora_file/tnsnames.ora 

这样,如果由于某种原因客户端使用了错误的tnsnames.ora文件,它将始终以最新版本结束。

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的oraclenetworking,使用TNS_ADMINvariables是确保获得一致的tnsnames.ora文件的唯一方法。 (注意:以Windows为中心的答案)

不应该总是“$ ORACLE_ HOME / network / admin / tnsnames.ora”吗? 然后,你可以做“echo $ oracle_ home”或者* nix等价物。

@Pete Holberton你完全正确。 这让我想起了另外一个叫TWO_TASK的工具

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

strace sqlplus -L scott/tiger@orcl有助于在/home/oraclefind.tnsnames.ora文件,以find它所需的文件而不是$ORACLE_HOME/network/admin/tnsnames.ora文件。 感谢您的发布。

默认情况下,tnsnames.ora位于UNIX操作系统上的$ ORACLE_HOME / network / admin目录中,以及Windows操作系统上的ORACLE_HOME \ network \ admin目录中。 tnsnames.ora也可以存储在以下位置:

由TNS_ADMIN环境variables(或registry值)指定的目录

在UNIX操作系统上,全局configuration目录。 例如,在Solaris操作系统上,此目录是/ var / opt / oracle

如果您有多个ORACLE_HOMES,请注意您正在使用哪一个,因为tnsnames.ora文件的位置可能因ORACLE_HOME而异。

对于提到TWO_TASK环境variables的人来说,它用来设置一个默认的数据库服务名称来连接(可能是另一台服务器上的数据库)。 当您连接时,您设置TWO_TASK的服务名称将在tnsnames.ora文件中查找。

最简单的方法可能是检查连接到数据库的进程的PATH环境variables。 很可能tnsnames.ora文件位于path .. \ network \ admin中的第一个Oracle bin目录中 。 TNS_ADMIN环境variables或registry中的值(用于当前Oracle主目录)可能会覆盖此值。

像其他人所build议的那样使用filemon也是可以的。

不是直接回答你的问题,但我一直很沮丧自己试图find并更新所有的tnsnames文件,因为我有几个oracle安装:客户端,BI工具,OWB等,每个都有自己的oracle主页。 我最终创build了一个名为TNSNamesSync的实用程序,它将更新所有oracle家中的所有tnsnames。 这是在MIT许可下,可以在这里免费使用https://github.com/artybug/TNSNamesSync/releases

文档在这里: https : //github.com/artchik/TNSNamesSync/blob/master/README.md

但是,这仅适用于Windows。