正在确定相关 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.ora
。 sqlnet.ora
和 ldap.ora
:
- 当前工作目录中的 Oracle 网络文件 (PWD/CWD)
TNS_ADMIN
会话定义或用户定义的脚本
TNS_ADMIN
定义为全局环境变量
TNS_ADMIN
在注册表中定义
%ORACLE_HOME/network|net80\admin
中的 Oracle 网络文件(Oracle 默认位置)
但是,我不确定每个 application/driver 是否都遵循这个列表。我从 Oracle Document 111942.1 那里得到了这个列表,指的是 Oracle 9i,所以它可能已经过时了。
在Database Net Services Administrator's Guide中的顺序是
TNS_ADMIN
由环境变量定义
TNS_ADMIN
在注册表中定义(如果 TNS_ADMIN
环境变量不存在)
%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
更新
当我 运行 在我的机器上进行测试时,我得到以下命令:
- 环境变量
TNS_ADMIN
- 注册表项
HKEY_CURRENT_USER\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
注册表项 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
环境变量未设置时。
%ORACLE_HOME%\network\admin
- 当前目录(可以与您的应用程序所在的目录不同)
- 您的应用程序所在的文件夹
更新 2
显然没有固定搜索,它因人而异providers/drivers。也许这也取决于 Oracle 版本。
例如,Oracle HTTP Server 从 opmn.xml
配置文件中读取 TNS_ADMIN
设置。
另一个例子,对于 ODP.NET Managed Driver (Oracle.ManagedDataAccess) beta 版本,我在 Oracle Managed and TNS Names 找到了这个命令:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的 'dataSources' 部分中的数据源别名(即 machine.config
、web.config
、user.config
)。
tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN
指定的位置。
tnsnames.ora
文件中的数据源别名存在于与 .exe
. 相同的目录中
tnsnames.ora
文件中的数据源别名出现在 %TNS_ADMIN%
(其中 %TNS_ADMIN%
是环境变量设置)。
tnsnames.ora
文件中的数据源别名出现在 %ORACLE_HOME%\network\admin
(其中 %ORACLE_HOME%
是环境变量设置)。
在官方 documentation(12c 第 4 版(12.1.0.2.4))中它说:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的 dataSources
部分中的数据源别名(即 machine.config
、web.config
、user.config
)。
tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中 TNS_ADMIN
指定的位置。位置可以由绝对或相对目录路径组成。
tnsnames.ora
文件中的数据源别名存在于与 .exe
. 相同的目录中
但是,根据我使用 ODP.NET 托管驱动程序 (4.121.2.0) 进行的一些测试,它考虑了 %ORACLE_HOME%\network\admin
和 TNS_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
我安装了 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.ora
。 sqlnet.ora
和 ldap.ora
:
- 当前工作目录中的 Oracle 网络文件 (PWD/CWD)
TNS_ADMIN
会话定义或用户定义的脚本TNS_ADMIN
定义为全局环境变量TNS_ADMIN
在注册表中定义%ORACLE_HOME/network|net80\admin
中的 Oracle 网络文件(Oracle 默认位置)
但是,我不确定每个 application/driver 是否都遵循这个列表。我从 Oracle Document 111942.1 那里得到了这个列表,指的是 Oracle 9i,所以它可能已经过时了。
在Database Net Services Administrator's Guide中的顺序是
TNS_ADMIN
由环境变量定义TNS_ADMIN
在注册表中定义(如果TNS_ADMIN
环境变量不存在)%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
更新
当我 运行 在我的机器上进行测试时,我得到以下命令:
- 环境变量
TNS_ADMIN
- 注册表项
HKEY_CURRENT_USER\SOFTWARE\ORACLE\KEY_{Oracle_Home_Name}\TNS_ADMIN
注册表项
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
环境变量未设置时。%ORACLE_HOME%\network\admin
- 当前目录(可以与您的应用程序所在的目录不同)
- 您的应用程序所在的文件夹
更新 2
显然没有固定搜索,它因人而异providers/drivers。也许这也取决于 Oracle 版本。
例如,Oracle HTTP Server 从 opmn.xml
配置文件中读取 TNS_ADMIN
设置。
另一个例子,对于 ODP.NET Managed Driver (Oracle.ManagedDataAccess) beta 版本,我在 Oracle Managed and TNS Names 找到了这个命令:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的 'dataSources' 部分中的数据源别名(即machine.config
、web.config
、user.config
)。 tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中TNS_ADMIN
指定的位置。tnsnames.ora
文件中的数据源别名存在于与.exe
. 相同的目录中
tnsnames.ora
文件中的数据源别名出现在%TNS_ADMIN%
(其中%TNS_ADMIN%
是环境变量设置)。tnsnames.ora
文件中的数据源别名出现在%ORACLE_HOME%\network\admin
(其中%ORACLE_HOME%
是环境变量设置)。
在官方 documentation(12c 第 4 版(12.1.0.2.4))中它说:
- .NET 配置文件中
<oracle.manageddataaccess.client>
部分下的dataSources
部分中的数据源别名(即machine.config
、web.config
、user.config
)。 tnsnames.ora
文件中的数据源别名,位于 .NET 配置文件中TNS_ADMIN
指定的位置。位置可以由绝对或相对目录路径组成。tnsnames.ora
文件中的数据源别名存在于与.exe
. 相同的目录中
但是,根据我使用 ODP.NET 托管驱动程序 (4.121.2.0) 进行的一些测试,它考虑了 %ORACLE_HOME%\network\admin
和 TNS_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