有时我会遇到 Oracle 连接问题,因为我无法确定我的数据库客户端正在使用哪个 tnsnames.ora 文件。
解决这个问题的最佳方法是什么?++对各种平台解决方案感到高兴。
有时我会遇到 Oracle 连接问题,因为我无法确定我的数据库客户端正在使用哪个 tnsnames.ora 文件。
解决这个问题的最佳方法是什么?++对各种平台解决方案感到高兴。
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
目录中。
对于 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'
将显示所有失败的文件路径。
TNS 位置存储在另一个地方:如果您使用的是 Windows,请打开regedit
并导航到My HKEY Local Machine/Software/ORACLE/KEY_OraClient10_home1
您KEY_OraClient10_home1
的 Oracle 主目录。如果有一个名为 的字符串条目TNS_ADMIN
,那么该条目的值将指向 Oracle 在您的计算机上使用的 TNS 文件。
在我的开发机器上,我有三个不同版本的 Oracle 客户端软件。我tnsnames.ora
在其中一个中管理文件。在另外两个中,我在tnsnames.ora
文件中输入了:
ifile=path_to_tnsnames.ora_file/tnsnames.ora
这样,如果由于某种原因tnsnames.ora
客户端使用了错误的文件,它将始终以最新版本结束。
对于 Windows: SysInternals 的Filemon将显示正在访问的文件。
请记住设置您的过滤器,这样您就不会被繁琐的文件系统流量所淹没。
补充: Filemon 不适用于较新的 Windows 版本,因此您可能必须使用Process Monitor。
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 为中心的答案)
默认情况下,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 的服务名称。
它不应该总是“$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)所在的目录。
strace sqlplus -L scott/tiger@orcl
有助于查找.tnsnames.ora
文件/home/oracle
以查找所需的文件而不是$ORACLE_HOME/network/admin/tnsnames.ora
文件。感谢您的发帖。
不是直接回答您的问题,但我自己尝试查找和更新所有 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。
最简单的方法可能是检查连接到数据库的进程的PATH环境变量。tnsnames.ora 文件很可能位于路径..\network\admin中的第一个 Oracle bin 目录中。TNS_ADMIN 环境变量或注册表中的值(对于当前的 Oracle 主目录)可能会覆盖它。
像其他人建议的那样使用 filemon 也可以解决问题。