解析 TNS_ADMIN 环境变量的配置
文章目录
解析 TNS_ADMIN 环境变量的配置
TNS_ADMIN 环境变量的配置,一般是Oracle远程连接数据库的必要配置之一。下面对这一配置进行解析。
0. 序言
- TNS_ADMIN 环境变量的作用:指定读取的 tnsnames.ora 文件的位置。
- TNS_ADMIN 环境变量的取值:tnsnames.ora 文件所在目录。
- 当配置了TNS_ADMIN 环境变量之后,使用网络服务名连接Oracle数据库时,监听服务会优先读取指定目录下相关文件sqlnet.ora、tnsnames.ora。当在指定目录读取不到时,才会去读取默认的Oracle安装目录。
1. 背景
Oracle服务端:
D:\databases\oracle\oracle_11g\app\administrator\product\11.2.0\dbhome_1\NETWORK\ADMINOracle客户端:
D:\databases\oracle\oracle_client\instantclient_21_9\network\admin环境变量TNS_ADMIN:
D:\databases\oracle\oracle_client\instantclient_21_9\network\admin 或者 D:\databases\oracle\oracle_11g\app\administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN 备注: 根据情况选择,安装好Oracle数据库后,系统默认读取服务端,一般配置时会倾向于选择客户端(即第一种,当然前提是安装了Oracle客户端)。
2. 案例
2.1 操作
在CMD控制台上,执行命令:
tnsping connect_identifier_remote_orcl备注:上面示例中的 connect_identifier_remote_orcl 是网络服务名。
2.2 具体案例
(1)在
客户端找到并成功解析的例子(可以看到控制台输出中“已使用的参数文件”的取值是Oracle客户端):C:\Users\administrator>tnsping connect_identifier_remote_orcl TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 18-3月 -2023 15:40:06 Copyright (c) 1997, 2010, Oracle. All rights reserved. 已使用的参数文件: D:\databases\oracle\oracle_client\instantclient_21_9\network\admin\sqlnet.ora 已使用 TNSNAMES 适配器来解析别名 尝试连接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = Administrator-PC)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = remote_orcl))) OK (0 毫秒)(2)在
服务端找到并成功解析的例子(可以看到控制台输出中“已使用的参数文件”的取值是Oracle服务端):C:\Users\administrator>tnsping connect_identifier_remote_orcl TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 18-3月 -2023 15:50:04 Copyright (c) 1997, 2010, Oracle. All rights reserved. 已使用的参数文件: D:\databases\oracle\oracle_11g\app\administrator\product\11.2.0\dbhome_1\network\admin\sqlnet.ora 已使用 TNSNAMES 适配器来解析别名 尝试连接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = Administrator-PC)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = remote_orcl))) OK (20 毫秒)(3)找不到的例子(可以看到控制台输出中“已使用的参数文件”的取值为空):
C:\Users\administrator>tnsping connect_identifier_remote_orcl TNS Ping Utility for 64-bit Windows: Version 11.2.0.1.0 - Production on 18-3月 -2023 15:28:33 Copyright (c) 1997, 2010, Oracle. All rights reserved. 已使用的参数文件: TNS-03505: 无法解析名称
3. 分析
- 本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量没有配置,则监听服务默认读取Oracle安装目录下的文件(服务端),当发现找不到(即没有tnsnames.ora文件或者tnsnames.ora文件中没有对应的网络服务名(如connect_identifier_remote_orcl的配置))时,就会报错“TNS-03505: 无法解析名称”。
本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量配置了“服务端”,则监听服务默认读取TNS_ADMIN 环境变量指定目录下的文件(服务端),当发现找不到(即没有tnsnames.ora文件或者tnsnames.ora文件中没有对应的网络服务名(如connect_identifier_remote_orcl的配置))时,就会报错“TNS-03505: 无法解析名称”。
- 本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量配置了“客户端”,如果只有一方有相关文件,则监听服务默认读取TNS_ADMIN 环境变量指定目录下的文件(客户端),当发现找不到(即没有tnsnames.ora文件或者tnsnames.ora文件中没有对应的网络服务名(如connect_identifier_remote_orcl的配置))时,就会去默认读取Oracle安装目录下的文件(服务端)。如果发现客户端和服务端都找不到tnsnames.ora文件时,就会报错“TNS-03505: 无法解析名称”。
- 本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量配置了“客户端”,如果服务端和客户端都有相关文件,那么只会读取客户端的文件(如tnsnames.ora文件),而不会去读取服务端的文件(如tnsnames.ora文件),即使是connect_identifier_remote_orcl的配置只在服务端才有也不会去读取。
4. 结论
- TNS_ADMIN 环境变量默认指定Oracle服务端安装目录(如:D:\app\administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN),所以TNS_ADMIN配置了服务端的NETWORK\ADMIN目录或者没有配置,效果一样。
- 当TNS_ADMIN 环境变量配置了客户端的network\admin目录(如:D:\databases\oracle\oracle_client\instantclient_21_9\network\admin)后,就会优先读取该目录的文件,如果在该目录没有找到相关文件,这时就会去Oracle服务端安装目录(如:D:\app\administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN)读取。
- TNS_ADMIN 环境变量指定目录下的文件会覆盖默认安装目录下的文件(服务端);读取维度以
文件为基准,而不是以文件中的配置项为基准。
附录:与监听服务有关的三个重要文件(listener.ora、sqlnet.ora、tnsnames.ora)
(1)原始文件
Oracle数据库安装成功后生成的三个原始文件,请参考:Oracle数据库中重要的三个文件(listener.ora、sqlnet.ora、tnsnames.ora)
(2)修改后的文件
支持网络服务名为 CONNECT_IDENTIFIER_REMOTE_ORCL 、CONNECT_IDENTIFIER_CHATGPTORCL 的数据库连接访问。
示例:
listener.ora(属于
服务端文件)SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = D:\databases\oracle\oracle_11g\app\administrator\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:D:\databases\oracle\oracle_11g\app\administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = Administrator-PC)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) ) ADR_BASE_LISTENER = D:\databases\oracle\oracle_11g\app\administratorsqlnet.ora(属于
客户端文件)# sqlnet.ora Network Configuration File: D:\databases\oracle\oracle_client\instantclient_21_9\network\admin\sqlnet.ora # Generated by Oracle configuration tools. SQLNET.AUTHENTICATION_SERVICES= (NTS) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) ADR_BASE = D:\databases\oracle\oracle_11g\app\administratortnsnames.ora(属于
客户端文件)# tnsnames.ora Network Configuration File: D:\databases\oracle\oracle_client\instantclient_21_9\network\admin\tnsnames.ora # Generated by Oracle configuration tools. LISTENER_ORCL = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) CONNECT_IDENTIFIER_REMOTE_ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = remote_orcl) ) ) CONNECT_IDENTIFIER_CHATGPTORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = Administrator-PC)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = chatgptorcl.com) ) )
注意事项
1. 修改 listener.ora 之后,需要注意什么?
特别注意:每次修改listener.ora,都必须重启监听服务OracleOraDb11g_home1TNSListener。
重启监听服务的方式有以下两种:
方式1:直接在“服务”界面找到监听服务OracleOraDb11g_home1TNSListener,右键选择“重新启动”。
方式2:管理员身份打开CMD控制台,输入以下命令重启监听服务。
lsnrctl stop lsnrctl start
2. 修改 TNS_ADMIN 环境变量之后,需要注意什么?
特别注意:当修改了环境变量 TNS_ADMIN 之后,不需要重启监听服务,但是需要重新打开CMD控制台,才能使用修改生效后的内容。
TNS_ADMIN 环境变量的设置如下:
TNS_ADMIN=%ORACLE_HOME%\network\admin
更多推荐
所有评论(0)