57

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

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

4

11 回答 11

83

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

于 2008-08-27T09:41:36.483 回答
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'

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

于 2008-08-13T23:52:15.570 回答
5

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

于 2008-08-30T09:12:33.723 回答
5

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

ifile=path_to_tnsnames.ora_file/tnsnames.ora

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

于 2008-10-14T08:09:28.587 回答
4

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

请记住设置您的过滤器,这样您就不会被繁琐的文件系统流量所淹没。

过滤器对话框

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

于 2008-08-27T09:08:55.297 回答
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 为中心的答案)

于 2008-10-09T20:45:48.043 回答
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 的服务名称。

于 2008-08-31T23:05:25.133 回答
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)所在的目录。

于 2008-08-14T17:23:45.723 回答
1

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

于 2013-12-11T15:30:40.087 回答
1

不是直接回答您的问题,但我自己尝试查找和更新所有 tnsnames 文件感到非常沮丧,因为我安装了几个 oracle:客户端、BI 工具、OWB 等,每个都有自己的 oracle 主页。我最终创建了一个名为 TNSNamesSync 的实用程序,它将更新所有 oracle home 中的所有 tnsname。它在 MIT 许可下,可以在这里免费使用https://github.com/artybug/TNSNamesSync/releases

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

不过,这仅适用于 Windows。

于 2016-03-25T22:24:15.723 回答
0

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

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

于 2008-12-04T20:31:19.863 回答