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

时间:2020-03-05 18:39:30  来源:igfitidea点击:

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

解决这个问题的最佳方法是什么? ++对各种平台解决方案感到满意。

解决方案

回答

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

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

回答

它不应该一直是" $ 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)所在的目录。

回答

对于Windows:来自SysInternals的Filemon将向我们显示正在访问哪些文件。

切记要设置过滤器,以免被文件系统的混乱情况淹没。

补充:Filemon不适用于较新的Windows版本,因此我们可能必须使用Process Monitor。

回答

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:\>

这应该显示我们正在使用的文件。该实用程序位于Oraclebin目录中。

回答

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

回答

默认情况下,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到另一个ORACLE_HOME。

对于提到TWO_TASK环境变量的人,该变量用于设置要连接的默认数据库服务名称(可以是另一台服务器上的数据库)。连接时,将在tnsnames.ora文件中查找将TWO_TASK设置为的服务名称。

回答

Codeslave询问"是否总是" $ ORACLE_ HOME / network / admin / tnsnames.ora"?答案是否定的,不是。请考虑同一台计算机上tnsping的这两个调用:

C:\Documents and Settings\me>D:\Oracle.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.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.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为中心的答案)

回答

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

ifile=path_to_tnsnames.ora_file/tnsnames.ora

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

回答

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

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