有什么最好的方法可以解决这个问题?++对各种平台解决方案感到高兴。
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'
将显示所有失败的文件路径。
tnsnames.ora
文件。在另外两个版本中,我已经输入了 tnsnames.ora
文件内容。ifile=path_to_tnsnames.ora_file/tnsnames.ora
这样,如果客户端因某些原因使用了错误的 tnsnames.ora
文件,它将始终最终指向最新版本。
在另一个位置存储了TNS的位置:如果您使用的是Windows系统,请打开regedit
并导航到我的 HKEY 本地机器/软件/ORACLE/KEY_OraClient10_home1
,其中KEY_OraClient10_home1
代表您的Oracle主目录。如果有一个名为TNS_ADMIN
的字符串条目,则该条目的值将指向计算机上Oracle正在使用的TNS文件。
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>
TNS_ADMIN
环境变量是关键。对于 PowerShell,它是 $env:TNS_Admin
。对于 C#,是 Environment.GetEnvironmentVariable("TNS_Admin")
。 - Greg Burghardt对于Windows系统:从SysInternals下载的Filemon可以展示给你正在被访问的文件。
记得设置筛选器以避免被过多的文件系统流量所淹没。
补充:由于Filemon已不能与较新版本的Windows系统兼容,因此您可能需要使用Process Monitor代替。
strace sqlplus -L scott/tiger@orcl
帮助查找 /home/oracle
上的 .tnsnames.ora
文件,以便找到它所取代的 $ORACLE_HOME/network/admin/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)所在的目录。