解析 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\ADMIN

Oracle客户端:

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. 分析

  1. 本地安装了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: 无法解析名称”。

  2. 本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量配置了“客户端”,如果只有一方有相关文件,则监听服务默认读取TNS_ADMIN 环境变量指定目录下的文件(客户端),当发现找不到(即没有tnsnames.ora文件或者tnsnames.ora文件中没有对应的网络服务名(如connect_identifier_remote_orcl的配置))时,就会去默认读取Oracle安装目录下的文件(服务端)。如果发现客户端和服务端都找不到tnsnames.ora文件时,就会报错“TNS-03505: 无法解析名称”。

  3. 本地安装了Oracle数据库之后,如果 TNS_ADMIN 环境变量配置了“客户端”,如果服务端和客户端都有相关文件,那么只会读取客户端的文件(如tnsnames.ora文件),而不会去读取服务端的文件(如tnsnames.ora文件),即使是connect_identifier_remote_orcl的配置只在服务端才有也不会去读取。

4. 结论

  1. TNS_ADMIN 环境变量默认指定Oracle服务端安装目录(如:D:\app\administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN),所以TNS_ADMIN配置了服务端的NETWORK\ADMIN目录或者没有配置,效果一样。

  2. 当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)读取。

  3. 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\administrator

sqlnet.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\administrator


tnsnames.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
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐