正在确定相关 tnsnames.ora 文件的位置

Determining location of relevant tnsnames.ora file

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

1. C:\Oracle\product203_32bit\CLIENT_1\NETWORK\ADMIN
2. C:\Oracle\product203_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),这对我来说意味着 32 位程序 Toad 应该使用 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.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.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\product203_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\product203_32bit\CLIENT_1\dbs
    LOCAL:
    Client DLL:c:\oracle\product203_32bit\CLIENT_1\bin\oci.dll
    TNSNames.ora:
    SQLNet.ora:
    LDAP.ora:
    Login.sql:
    GLogin.sql:c:\oracle\product203_32bit\CLIENT_1\sqlplus\admin\glogin.sql
    In system PATH:Yes

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

问题 2: 为什么 32 位 TOAD 不使用位置 #1 中的 tns 而只使用位置 #3 中的 tns?

Q3: 如果我留在位置 3 的 tns 文件上,dbForge 和 TOAD 都可以工作,但我想知道为什么,这样我就可以准确地理解如何移动 tns从一台机器到另一台机器的信息。

根据您的路径,您怀疑安装了两个客户端(Toad 和 dbforge 是工具,而不是客户端,所以您的术语有点偏离)。一个 32 位,另一个 64 位。根据其安装路径,Toad 似乎是 32 位的,但执行它并转到 Help|Support Bundle。您会看到顶部 header 将是 "APPLICATION INFORMATION (32-bit)" 或 "APPLICATION INFORMATION (64-bit)" 只是为了确认。 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 环境变量。

根据 Oracle,这些位置分别搜索 tnsnames.orasqlnet.oraldap.ora:

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

但是,我不确定每个 application/driver 是否都遵循这个列表。我从 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,我建议为它创建一个符号link - 只是在非常安全的一面,例如mklink /d %ORACLE_HOME%\network\admin c:\Oracle\common\settings\admin

另外请注意,您不必 "play" 使用 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

显然没有固定搜索,它因人而异providers/drivers。也许这也取决于 Oracle 版本。

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

另一个例子,对于 ODP.NET Managed Driver (Oracle.ManagedDataAccess) beta 版本,我在 Oracle Managed and TNS Names 找到了这个命令:

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

在官方 documentation(12c 第 4 版(12.1.0.2.4))中它说:

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

但是,根据我使用 ODP.NET 托管驱动程序 (4.121.2.0) 进行的一些测试,它考虑了 %ORACLE_HOME%\network\adminTNS_ADMIN 环境变量。 Locks like the documentation 不是 100% 正确的。

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

32 位安装:

c:\program files (x86)\oracle developer tools for vs2017\network\admin\tnsnames.ora

64 位安装:

c:\program files\oracle developer tools for vs2017\network\admin\tnsnames.ora