【问题标题】:Determining location of relevant tnsnames.ora file确定相关 tnsnames.ora 文件的位置
【发布时间】:2015-02-02 15:17:34
【问题描述】:

我安装了 32 位和 64 位 Oracle 11g 驱动程序。我在我的电脑上搜索名称为“tnsnames.ora”的文件,并在以下位置找到了 3 个:

1. C:\Oracle\product\11203_32bit\CLIENT_1\NETWORK\ADMIN
2. C:\Oracle\product\11203_64bit\CLIENT_1\NETWORK\ADMIN
3. C:\Windows\TNS

tnsnames.ora 文件的第三个位置的存在让我感到惊讶。

我的 PC 上安装了以下 Oracle 客户端:

"C:\Program Files (x86)\Quest Software\Toad for Oracle 11.6\Toad.exe"
"C:\Program Files\Devart\dbForge Studio Express for Oracle\dbforgeoracle.exe"

根据每个程序的位置(Program Files (x86) vs. c:\Program Files),这表明 Toad(一个 32 位程序)应该使用 32 位驱动程序,而 dbForge 应该使用 64位驱动程序。

dbForge 似乎使用位置#2 或#3 中的tnsnames.ora 文件。我通过系统地重命名除一个 tns 文件之外的所有文件来了解这一点,然后在尝试从应用程序创建新连接时检查从文件中读取的连接名称是否可用。

但是,TOAD 似乎只识别位置 #3 中的 tnsnames.ora 文件,而根本不识别位置 2 中的 tnsnames.ora 文件! (由于它是一个 32 位程序,我没想到它会识别位置 2 中的 tns 文件,事实就是如此)。为了希望清楚起见,总结 TOAD 测试,TOAD 仅识别位置 3 中的 tns 文件。

其他同事在他们的机器上的位置 3 中没有 tns 文件。我不确定我为什么这样做。当我运行 Toad 时,它显示以下 2 个 Home,其中 32 位 Home 是活动的。

OraClient11g_home1 (11.2.0.3)
    ORACLE_HOME:C:\app\C39293\product\11.2.0\client_1
    ORACLE_HOME_NAME:OraClient11g_home1
    ORACLE_HOME_KEY:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1
    ORACLE_SID:
    NLS_LANG:AMERICAN_AMERICA.WE8MSWIN1252
    SQLPATH:
    LOCAL:
    Client DLL:C:\app\C39293\product\11.2.0\client_1\oci.dll
    TNSNames.ora:
    SQLNet.ora:
    LDAP.ora:
    Login.sql:
    GLogin.sql:
    In system PATH:No
    Home is valid:No
OraClient11g_home1_32bit (11.2.0.3)
    ORACLE_HOME:c:\oracle\product\11203_32bit\CLIENT_1
    ORACLE_HOME_NAME:OraClient11g_home1_32bit
    ORACLE_HOME_KEY:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1_32bit
    ORACLE_SID:
    NLS_LANG:AMERICAN_AMERICA.WE8MSWIN1252
    SQLPATH:c:\oracle\product\11203_32bit\CLIENT_1\dbs
    LOCAL:
    Client DLL:c:\oracle\product\11203_32bit\CLIENT_1\bin\oci.dll
    TNSNames.ora:
    SQLNet.ora:
    LDAP.ora:
    Login.sql:
    GLogin.sql:c:\oracle\product\11203_32bit\CLIENT_1\sqlplus\admin\glogin.sql
    In system PATH:Yes

Q1: OraClient11g_home1 是我的 64 位家庭还是我安装了两个 Oracle 客户端?

Q2:为什么 32 位 TOAD 不使用位置 #1 的 tns,而只使用位置 #3 的 tns?

Q3:如果我保留位置 3 的 tns 文件,dbForge 和 TOAD 都可以工作,但我想知道原因,以便准确了解如何将 tns 信息从一台机器移动到另一个。

【问题讨论】:

    标签: oracle sqlplus toad


    【解决方案1】:

    根据 Oracle 的说法,这些位置被搜索为 tnsnames.ora,resp。 sqlnet.ora 和 ldap.ora:

    1. 当前工作目录中的 Oracle Net 文件 (PWD/CWD)
    2. TNS_ADMIN 会话定义或用户定义脚本
    3. TNS_ADMIN 定义为全局环境变量
    4. TNS_ADMIN 在注册表中定义
    5. %ORACLE_HOME/network|net80\admin 中的 Oracle Net 文件(Oracle 默认位置)

    但是,我不确定每个应用程序/驱动程序是否都遵循此列表。我从 Oracle Document 111942.1 那里得到了这个列表,指的是 Oracle 9i,所以它可能已经过时了。

    在Database Net Services Administrator's Guide 中的顺序是

    1. TNS_ADMIN 由环境变量定义
    2. TNS_ADMIN 在注册表中定义(如果 TNS_ADMIN 环境变量不存在)
    3. %ORACLE_HOME%/network/admin 目录(如果TNS_ADMIN 环境变量不存在)

    我建议为TNS_ADMIN 定义一个环境变量,并且只使用一个tnsnames.ora 文件。为了安全起见,还要检查您的注册表值。

    如果您的文件不位于%ORACLE_HOME%\network\admin,我建议为它创建一个符号链接 - 只是为了非常安全,例如mklink /d %ORACLE_HOME%\network\admin c:\Oracle\common\settings\admin

    另外请注意,您不必“玩”您的 tnsnames.ora 文件。使用来自 Microsoft Sysinternals 的 Process Monitor,您可以监控每个文件访问,即过滤器将是 Path contains tnsnames

    更新

    当我在我的机器上运行测试时,我得到以下命令:

    1. 环境变量TNS_ADMIN
    2. 注册表键HKEY_CURRENT_USER\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
    3. 注册表键HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN,分别。 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN

      -> 仅当TNS_ADMIN 未设置环境变量时。

    4. %ORACLE_HOME%\network\admin
    5. 当前目录(可能与您的应用程序所在的目录不同)
    6. 您的应用程序所在的文件夹

    更新 2

    显然没有修复搜索,它因不同的提供商/驱动程序而异。也许这也取决于 Oracle 版本。

    例如,Oracle HTTP Server 从 opmn.xml 配置文件中读取 TNS_ADMIN 设置。

    另一个例子,对于 ODP.NET 托管驱动程序 (Oracle.ManagedDataAccess) beta 版本,我在Oracle Managed and TNS Names 找到了这个订单:

    1. .NET 配置文件中<oracle.manageddataaccess.client> 部分下的“dataSources”部分中的数据源别名(即machine.config、web.config、user.config)。
    2. tnsnames.ora 文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN 指定的位置。
    3. 与.exe 位于同一目录中的tnsnames.ora 文件中的数据源别名。
    4. tnsnames.ora 文件中的数据源别名存在于%TNS_ADMIN%
      (其中%TNS_ADMIN% 是环境变量设置)。
    5. tnsnames.ora 文件中的数据源别名存在于%ORACLE_HOME%\network\admin
      (其中%ORACLE_HOME% 是环境变量设置)。

    在官方documentation(12c Release 4 (12.1.0.2.4))中说:

    1. .NET 配置文件中<oracle.manageddataaccess.client> 部分下的dataSources 部分中的数据源别名(即machine.config、web.config、user.config)。
    2. tnsnames.ora 文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN 指定的位置。位置可以由绝对或相对目录路径组成。
    3. 与.exe 位于同一目录中的tnsnames.ora 文件中的数据源别名。

    但是,根据我使用 ODP.NET 托管驱动程序 (4.121.2.0) 进行的一些测试,它考虑了 %ORACLE_HOME%\network\admin 和 TNS_ADMIN 环境变量。像文档这样的锁并不是 100% 正确的。

    【讨论】:

      【解决方案2】:

      仅根据您的路径,您怀疑安装了两个客户端(Toad 和 dbforge 是工具,而不是客户端,因此您的术语有点偏离)。一个 32 位,另一个 64 位。根据其安装路径,Toad 似乎是 32 位的,但执行它并转到 Help|Support Bundle。您会看到顶部标题将是“应用程序信息(32 位)”或“应用程序信息(64 位)”,只是为了确认。 Toad 11.6 是第一个引入 64 位版本的。

      Toad 只会看到与它相同平台的 Oracle 客户端。因此,对于 Toad 而言,您的 64 位客户端是无关紧要的。 C:\Windows\TNS 似乎是一个用于 TNS_ADMIN 文件夹的文件夹,因为它的位置很奇怪,而且 Toad 可以看到它。在命令提示符处执行 SET TNS_ADMIN 并查看它是否报告“TNS_ADMIN=C:\Windows\TNS” 如果是,则所有工具都应该使用该 tnsnames.ora。如果您将指向包含您的网络配置文件的文件夹,那将是一个全局覆盖。如果您没有将 TNS_ADMIN 设置为环境变量,请在您的 Oracle 根注册表中查找它:HKEY_LOCAL_MACHINE\Software\Oracle。

      如果您对所有工具使用一组通用连接,我会删除您所有的 tnsnames.ora 文件。我还会将该 C:\Windows\TNS 文件夹重新定位到更合适的位置,例如 C:\Oracle\Admin,并在那里创建您的 tnsnames.ora、sqlnet.ora 和 ldap.ora(如果适用)。创建一个指向该位置的 TNS_ADMIN 环境变量。

      【讨论】:

      • 其实,看起来你有三个家。 Toad 找到了两个,看起来您可能也安装了 64 位。
      • 是的,当我打开一个 cmnd 窗口并键入 echo %TNS_ADMIN% 时,它会显示 C:\Windows\TNS。因此,似乎我确实有这个我以前不知道的环境变量。这似乎是我需要的缺少的信息。谢谢。
      • HKEY_LOCAL_MACHINE\Software\Oracle 用于 x64 Oracle 客户端。 32 位客户端在HKEY_LOCAL_MACHINE\Software\Wow6432Node\Oracle中搜索
      【解决方案3】:

      如果您使用的是 Visual Studio v2017,这里是 tnsNames 文件:

      32位安装:

      c:\program files (x86)\oracle 开发者工具 vs2017\network\admin\tnsnames.ora

      64位安装:

      c:\program files\oracle 开发者工具 vs2017\network\admin\tnsnames.ora

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2020-08-07
        • 1970-01-01
        • 2016-11-15
        • 1970-01-01
        • 2011-11-25
        相关资源
        最近更新 更多