TNS 是 Oracle Net Services 的核心,它负责客户端和服务器之间的网络通信,理解并熟练使用 TNS 命令是 Oracle DBA 和开发人员的基本功。

这些命令主要分为两大类:
- 客户端工具命令:在你的电脑上(客户端)执行,用于测试连接、配置网络等。
- 服务器端命令/文件:在数据库服务器上执行或修改,用于配置网络监听和服务。
客户端工具命令
这些命令是日常排查连接问题最常用的。
sqlplus
最基本的连接工具,可以用来验证 TNS 别名是否有效。
语法:

sqlplus [username/password]@[TNS别名]
示例:
# 1. 以普通用户 scott 连接到本地的 ORCL 服务 sqlplus scott/tiger@ORCL # 2. 以 sysdba 权限连接,并指定主机字符串(TNS别名) sqlplus / as sysdba@ORCL # 3. 以 sysdba 权限连接,不使用 TNS(仅用于本地数据库,监听未启动时也能连) sqlplus / as sysdba
说明:
- 如果连接成功,说明 TNS 配置文件中的
[TNS别名]是正确的,网络通路没有问题。 - 如果失败,会报错如
ORA-12154: TNS:could not resolve the connect identifier specified,这通常意味着 TNS 别名在tnsnames.ora中找不到或配置错误。
tnsping
功能: 测试客户端是否能解析 TNS 别名,并成功连接到数据库的监听器,它不验证数据库实例是否真的启动,只验证到监听器的网络通路。
语法:

tnsping [TNS别名]
示例:
# 测试名为 ORCL 的 TNS 别名 tnsping ORCL # 输出示例 (成功): # Used TNSNAMES adapter to resolve the alias # Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL))) # OK (0 msec) # 输出示例 (失败 - 监听器未启动): # TNS:ping failed # Used TNSNAMES adapter to resolve the alias # Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL))) # TNS-12541: TNS:no listener
说明:
- OK (0 msec): 表示 TNS 解析成功,并且成功收到了监听器的响应。
- TNS-12541: TNS:no listener: 表示网络可以通到服务器 1521 端口,但监听器进程没有运行。
- ORA-12154: 表示在
tnsnames.ora文件中找不到这个 TNS 别名。
lsnrctl
功能: 监听器控制工具,虽然它主要用于服务器端,但在客户端也可以用来远程查询监听器的状态,这非常有用,尤其是在你怀疑服务器端监听器有问题时。
语法:
lsnrctl [command] [listener_name]
常用命令:
-
status: 查看监听器的状态,包括是否运行、监听的协议地址、注册的服务等。# 查看默认监听器(通常是 LISTENER) lsnrctl status # 查看名为 LISTENER_MYDB 的监听器 lsnrctl status LISTENER_MYDB
-
services: 查看当前在监听器上注册的服务,这对于确认数据库实例是否已注册到监听器至关重要。lsnrctl services
输出解读:
- 如果看到类似
(SERVICE_NAME = ORCL)的信息,说明数据库实例已经注册。 - 如果只看到
... READY ...而没有... STATE = READY ...,或者看不到服务名,说明实例可能没有启动或没有正确注册。
- 如果看到类似
-
version: 查看监听器版本。lsnrctl version
-
help: 查看所有可用命令。lsnrctl help
服务器端核心配置文件
这些不是命令,但理解和修改它们是解决 TNS 问题的根本。
tnsnames.ora
功能: 客户端(和部分服务器端工具)使用的 TNS 别名解析文件,它定义了如何连接到特定的 Oracle 服务。
位置:
- 客户端:
$ORACLE_HOME/network/admin/ - 服务器端:
$ORACLE_HOME/network/admin/(通常和客户端是同一个文件)
示例结构:
# tnsnames.ora
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ORCL) # 数据库的服务名
)
)
# 另一个示例,使用 SID (较老的方式,但有时仍需使用)
MYDB_OLD =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SID = MYDB) # 数据库的 SID
)
)
常见问题:
- ORA-12154:
tnsnames.ora文件中缺少或错误地定义了 TNS 别名。 - ORA-12514:
tnsnames.ora中定义的SERVICE_NAME或SID在监听器上不存在或未注册。
listener.ora
功能: 服务器端监听器的配置文件,它定义了监听器应该监听哪些网络地址(IP 和端口),以及它应该管理哪些数据库服务。
位置: $ORACLE_HOME/network/admin/
示例结构:
# listener.ora
# 默认监听器名称
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
# 可以添加更多地址,如 IPC
# (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
# 如果需要,可以为不同数据库创建多个监听器
# LISTENER_MYDB =
# (DESCRIPTION_LIST =
# (DESCRIPTION =
# (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1522))
# )
# )
# 静态注册:告诉监听器即使数据库没启动,也存在一个服务
# (SID_DESC =
# (GLOBAL_DBNAME = orcl.example.com)
# (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
# (SID_NAME = ORCL)
# )
关键点:
- 现代数据库推荐使用 动态注册(数据库实例启动后自动向监听器注册),
listener.ora中通常不需要SID_DESC部分。 - ORA-12541: 监听器没有运行,或者
listener.ora中没有配置客户端请求的那个地址。
sqlnet.ora
功能: 网络配置文件,控制客户端和服务器端网络行为的各个方面,如命名解析方法、日志记录、加密等。
位置: $ORACLE_HOME/network/admin/
示例结构:
# sqlnet.ora # 指定命名解析方法的顺序 (常用: TNSNAMES, ONAMES, HOSTNAME, LDAP) NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) # 启用客户端和服务器端的日志记录 # SQLNET.CLIENT_LOG_LEVEL = 16 # SQLNET.SERVER_LOG_LEVEL = 16 # SQLNET.CLIENT_LOG_DEST = /tmp/client.log # SQLNET.SERVER_LOG_DEST = /tmp/server.log # 设置连接超时时间 SQLNET.EXPIRE_TIME = 10 # 每 10 分钟发送一个包来检测连接是否还活着 # 安全设置,TNS Admin # TNS_ADMIN = /path/to/network/admin
常见问题:
- ORA-12154:
NAMES.DIRECTORY_PATH中没有包含TNSNAMES,或者顺序不对,可能导致找不到tnsnames.ora文件。 - 连接行为异常(如连接超时、加密失败等):可能与
sqlnet.ora的配置有关。
服务器端 lsnrctl 命令(管理员操作)
这些命令需要在数据库服务器上以具有权限的用户(如 oracle 用户)执行。
-
lsnrctl start: 启动监听器。lsnrctl start
-
lsnrctl stop: 停止监听器。lsnrctl stop
-
lsnrctl reload: 重载监听器配置文件 (listener.ora),而无需重启监听器,修改listener.ora后常用。lsnrctl reload
-
lsnrctl trace: 启动或停止监听器的跟踪,这是诊断复杂网络问题的终极手段。# 启动跟踪,级别为 16 (USER) lsnrctl trace user_listener 16 # 停止跟踪 lsnrctl trace off user_listener
Oracle Easy Connect (替代 TNSNAMES)
从 Oracle 10g 开始,引入了一种无需配置 tnsnames.ora 的连接方式,称为 Easy Connect。
语法:
sqlplus [username/password]@[host][:port]/service_name
示例:
# 连接到本地主机 1521 端口上的 ORCL 服务 sqlplus scott/tiger@localhost:1521/ORCL # 连接到远程主机 192.168.1.100 的 1521 端口上的 ORCL 服务 sqlplus scott/tiger@192.168.1.100:1521/ORCL
说明:
- 如果端口是默认的 1521,可以省略
1521。 - 这种方式非常方便,但缺乏
tnsnames.ora的灵活性和可管理性,不适合在生产环境中为大量用户配置连接。
总结与排查流程
当遇到 TNS 连接问题时,可以按照以下步骤排查:
- 检查客户端
tnsnames.ora: 确认 TNS 别名拼写、主机、端口、SERVICE_NAME或SID是否正确。 - 客户端执行
tnsping:- 如果失败,问题在客户端网络或配置。
- 如果成功,说明到监听器的网络是通的。
- 客户端执行
sqlplus尝试连接:如果失败,问题可能是数据库实例未注册或未启动。
- 客户端执行
lsnrctl status(远程查询):- 查看监听器是否运行。
- 查看
services输出,确认你的SERVICE_NAME或SID是否已经注册。
- 登录服务器检查:
- 检查服务器端
listener.ora配置是否正确。 - 检查数据库实例是否已启动 (
ps -ef | grep pmon)。 - 如果实例已启动但未注册,尝试重启监听器 (
lsnrctl reload或stop/start)。 - 检查服务器端日志(如
alert.log和监听器日志/u01/app/oracle/diag/tnslsnr/hostname/listener/trace/listener.log)。
- 检查服务器端
- 使用
lsnrctl trace: 如果以上步骤都无法定位问题,开启监听器跟踪,然后从客户端再次尝试连接,分析生成的跟踪文件。
