Oracle - 我使用的TNS名称文件是什么?

时间:2008-08-13 23:49:16

标签: oracle connection tnsnames tns

有时我会遇到Oracle连接问题,因为我无法弄清楚我的数据库客户端正在使用哪个tnsnames.ora文件。

最好的解决方法是什么? ++对各种平台解决方案感到满意

11 个答案:

答案 0 :(得分:72)

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

答案 1 :(得分:16)

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

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

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

请记住设置过滤器,以免被繁琐的文件系统流量所淹没。

Filter Dialog

已添加:Filemon不适用于较新的Windows版本,因此您可能必须使用Process Monitor

答案 4 :(得分:4)

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

ifile=path_to_tnsnames.ora_file/tnsnames.ora

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

答案 5 :(得分:3)

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为中心的答案)

答案 6 :(得分: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的服务名称。

答案 7 :(得分: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)所在的目录。

答案 8 :(得分:1)

strace sqlplus -L scott/tiger@orcl有助于查找.tnsnames.ora上的/home/oracle文件,以查找所需文件而非$ORACLE_HOME/network/admin/tnsnames.ora文件。感谢您的发布。

答案 9 :(得分:0)

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

使用像其他人建议的filemon也可以解决问题。

答案 10 :(得分:0)

没有直接回答你的问题,但是我自己试图找到并更新所有的tnsnames文件时非常沮丧,因为我有几个oracle安装:客户端,BI工具,OWB等,每个都有它自己的甲骨文家园。我最终创建了一个名为TNSNamesSync的实用程序,它将更新所有oracle家中的所有tnsnames。它是在麻省理工学院的许可下,可以在这里免费使用https://github.com/artybug/TNSNamesSync/releases

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

这仅适用于Windows。