【问题标题】:Oracle - What TNS Names file am I using?Oracle - 我使用的是什么 TNS 名称文件?
【发布时间】:2008-08-13 23:49:15
【问题描述】:

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

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

【问题讨论】:

    标签: oracle connection tnsnames tns


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢,基于此,/etc/tnsnames.ora 似乎是 tns 名称的可靠全球位置。
      • @AvindraGoolcharan,这也是我的结论。这就是我们放置它的地方并且没有任何问题。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        ifile=path_to_tnsnames.ora_file/tnsnames.ora
        

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • 你不只是喜欢多个预言家吗?
          • 这个答案的 +1 实在太多了。自从我不得不处理这个问题以来已经有几年了。 TNS_ADMIN 环境变量是关键。对于 PowerShell,它是 $env:TNS_Admin。 C# 是Environment.GetEnvironmentVariable("TNS_Admin")
          【解决方案6】:

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

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

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

          【讨论】:

            【解决方案7】:

            默认情况下,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 的服务名称。

            【讨论】:

              【解决方案8】:

              不应该总是“$ORACLE_HOME/network/admin/tnsnames.ora”吗? 然后你可以只做“echo $oracle_home”或*nix等价物。

              @皮特·霍尔伯顿 你是完全正确的。这让我想起了,还有另一个活动扳手,叫做 TWO_TASK

              根据http://www.orafaq.com/wiki/TNS_ADMIN
              TNS_ADMIN 是一个环境变量,指向 SQL*Net 配置文件(如 sqlnet.ora 和 tnsnames.ora)所在的目录。

              【讨论】:

              • 实际上,不,你不能假设这个位置。代理主目录和客户端主目录(仅举个例子)2,它们有自己的网络/管理目录。您得到的答案取决于您正在运行的可执行文件。
              【解决方案9】:

              strace sqlplus -L scott/tiger@orcl 帮助在/home/oracle 上查找.tnsnames.ora 文件以查找它所使用的文件而不是$ORACLE_HOME/network/admin/tnsnames.ora 文件。感谢发帖。

              【讨论】:

                【解决方案10】:

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

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

                不过,这仅适用于 Windows。

                【讨论】:

                  【解决方案11】:

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

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2015-10-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-12-16
                    • 2021-03-15
                    • 2014-10-05
                    • 2017-10-13
                    • 1970-01-01
                    相关资源
                    最近更新 更多