菜鸟科技网

Oracle TNS命令有哪些?

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

Oracle TNS命令有哪些?-图1
(图片来源网络,侵删)

这些命令主要分为两大类:

  1. 客户端工具命令:在你的电脑上(客户端)执行,用于测试连接、配置网络等。
  2. 服务器端命令/文件:在数据库服务器上执行或修改,用于配置网络监听和服务。

客户端工具命令

这些命令是日常排查连接问题最常用的。

sqlplus

最基本的连接工具,可以用来验证 TNS 别名是否有效。

语法:

Oracle TNS命令有哪些?-图2
(图片来源网络,侵删)
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 别名,并成功连接到数据库的监听器,它不验证数据库实例是否真的启动,只验证到监听器的网络通路。

语法:

Oracle TNS命令有哪些?-图3
(图片来源网络,侵删)
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_NAMESID 在监听器上不存在或未注册。

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 连接问题时,可以按照以下步骤排查:

  1. 检查客户端 tnsnames.ora: 确认 TNS 别名拼写、主机、端口、SERVICE_NAMESID 是否正确。
  2. 客户端执行 tnsping:
    • 如果失败,问题在客户端网络或配置。
    • 如果成功,说明到监听器的网络是通的。
  3. 客户端执行 sqlplus 尝试连接:

    如果失败,问题可能是数据库实例未注册或未启动。

  4. 客户端执行 lsnrctl status (远程查询):
    • 查看监听器是否运行。
    • 查看 services 输出,确认你的 SERVICE_NAMESID 是否已经注册。
  5. 登录服务器检查:
    • 检查服务器端 listener.ora 配置是否正确。
    • 检查数据库实例是否已启动 (ps -ef | grep pmon)。
    • 如果实例已启动但未注册,尝试重启监听器 (lsnrctl reloadstop/start)。
    • 检查服务器端日志(如 alert.log 和监听器日志 /u01/app/oracle/diag/tnslsnr/hostname/listener/trace/listener.log)。
  6. 使用 lsnrctl trace: 如果以上步骤都无法定位问题,开启监听器跟踪,然后从客户端再次尝试连接,分析生成的跟踪文件。
分享:
扫描分享到社交APP
上一篇
下一篇