• 正文
  • 相关推荐
申请入驻 产业图谱

DBA | Oracle 数据库监听网络配置管理实践指南

05/12 12:15
2060
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(DevSecOps),自动化运维工具开发与实践,企业网络安全防护,欢迎各位道友一起学习交流、一起进步 ,若此文对你有帮助,一定记得倒点个关注⭐与小红星❤️,收藏学习不迷路  。

Oracle 监听网络管理配置

前言简述

Oracle 监听器是客户端连接数据库服务的桥梁,默认使用 1521/TCP 端口,服务端需要配置监听文件才能接受客户端连接。通常客户端需要通过缺省端口连接 Oracle 服务端,但此监听端口我们可在服务端进行自定义的配置,下面就以 Windows 环境下安装 Oracle 12c 为例,介绍如何配置监听网络管理。

配置文件

在实践前先简单了解一下服务端、客户端相关核心配置文件,如下所示:

1.服务端配置文件

    listener.ora - 监听程序配置文件tnsnames.ora - TNS名称解析文件sqlnet.ora - 网络参数配置文件
# 服务端,监听文件
# C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = CLRExtProc)
      (ORACLE_HOME = C:apporacleproduct12.2.0dbhome_1)
      (PROGRAM = extproc)
      (ENVS = "EXTPROC_DLLS=ONLY:C:apporacleproduct12.2.0dbhome_1binoraclr12.dll")
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

# 服务端,TNS名称文件
# C:apporacleproduct12.2.0dbhome_1networkadmintnsnames.ora
ORACLR_CONNECTION_DATA =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (CONNECT_DATA =
      (SID = CLRExtProc)
      (PRESENTATION = RO)
    )
  )

HISTDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = histdb)
    )
  )

LISTENER_HISTDB =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521))


# 服务端,监听管理参数文件
# C:apporacleproduct12.2.0dbhome_1networkadminsqlnet.ora
SQLNET.AUTHENTICATION_SERVICES= (NTS)
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
# 解决 ORA-28040 错误,解决客户端与服务端版本不兼容导致无法连接问题。
SQLNET.ALLOWED_LOGON_VERSION=8
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
SQLNET.ALLOWED_LOGON_VERSION_SERVE=10

2.客户端配置文件

    tnsnames.ora - 客户端TNS名称解析文件
# 客户端,TNS名称文件
HISTDB=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.172.106)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = HISTDB)
    )
  )

管理命令

此小节简单介绍相关界面配置命令,及监听器管理、测试命令,帮助大家快速上手。

1.使用 Net Configuration Assistant 工具创建。

# Linux
$ netca
# Windows
$ C:apporacleproduct12.2.0dbhome_1binnetca

 

2.使用 lsnrctl 命令管理查看监听状态,可以看到默认监听了全部数据库实例。

$ lsnrctl start
$ lsnrctl stop
$ lsnrctl status

服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
  实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "histdb" 包含 1 个实例。
  实例 "histdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "histdbXDB" 包含 1 个实例。
  实例 "histdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "itgeekdb" 包含 1 个实例。
  实例 "itgeekdb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "itgeekdbXDB" 包含 1 个实例。
  实例 "itgeekdb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功

 

3.使用 tnsping 命令查看配置的TNS名称对象是否正常连接,例如,缺省以 orcl 数据库为例。

$ tnsping histdb
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = histdb)))
OK (10 毫秒)

实践案例

案例1.增加一个1522端口的监听

用于上面新创建的数据库(itgeekdb)使用,或容灾使用(通常),以 Windows 环境为例,大致流程如下:

1.使用netca工具创建新监听LISTENER1522

2.配置TCP协议1522端口

3.修改listener.ora添加静态注册信息

4.重启监听程序

步骤 01.使用命令行执行 netca ,打开 Oracle Net Configuration Assistant 助手界面,选择监听程序配置。

weiyigeek.top-netca网络配置助手

步骤 02.选择添加Oracle Net监听程,然后设置监听程序名称为LISTENER1522.

weiyigeek.top-设置监听程序

步骤 03.根据实际情况选择协议,通常选择TCPIPC协议即可,设置监听端口号为1522,IPC键值为 EXTPROC1522

weiyigeek.top-选择协议

步骤 04.继续点击下一步(N),显示如下界面则表示监听程序添加成功。

weiyigeek.top-查看监听配置

步骤 05.验证监听是否正常,可通过如下两个命令判断:

PS C:UsersAdministratorDesktop> NETSTAT.EXE -ano | findstr "1522"
  TCP    0.0.0.0:1522           0.0.0.0:0              LISTENING       8808
  TCP    [::]:1522              [::]:0                 LISTENING       8808
 
PS C:UsersAdministratorDesktop> lsnrctl status LISTENER1522
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-histdb)(PORT=1522)))
监听程序不支持服务  # 可以看到监听已经起来了,但是没有配置服务名称。
命令执行成功

可查看 register 与 local_listener 参数,前置是查询是否为自动配置监听,后者是当前监听器。默认情况下,数据库会将服务动态注册到名为LISTENER,监听端口为1521的监听器中。

SQL> show parameter register
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
hs_autoregister                      boolean                TRUE

SQL> show parameter local_listener
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
local_listener                       string                 LISTENER_ITGEEKDB

步骤 06.此外除了使用 netca 界面化配置外,为了便利还可直接修改 listener.ora 文件,使得我们可以通过 1522 端口访问,上文创建的 ITGEEKDB 数据库,修改示例如下。

# File: C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
SID_LIST_LISTENER1522 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ITGEEKDB)
      (ORACLE_HOME =C:apporacleproduct12.2.0dbhome_1)
      (SID_NAME = ITGEEKDB)
    )
  )

LISTENER1522 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522))
      (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))
    )
  )

步骤 07.修改完毕后,便可以重启监听器,查看服务状态。

$ lsnrctl stop LISTENER1522
$ lsnrctl start LISTENER1522
$ lsnrctl status LISTENER1522

  服务摘要..
  服务 "ITGEEKDB" 包含 1 个实例。
    实例 "ITGEEKDB", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
  命令执行成功

weiyigeek.top-使用navicat验证监听配置

至此,我们可通过1521、1522端口分别访问 itgeekdb 数据库。

案例2.新增一个itgeekdb_test的TNS网络服务别名

客户端,使用 netca 命令配置 TNSNAME.ora (当然也可手动配置),并测试连接到数据库。

步骤 01.同样,命令行执行 netca ,打开如下界面,选择本地Net服务名配置

weiyigeek.top-打开netca

步骤 02.选择添加服务名称,设置 Oracle 数据库服务名称,例如上文新建的itgeekdb数据库。

weiyigeek.top-选择itgeekdb数据库

步骤 03.配置要连接的 Oracle 数据库服务端 IP地址与监听端口,然后此处可选择是否进行登录测试。

weiyigeek.top-配置实例连接

步骤 04.若选择则跳过此步骤,若为是则显示如下界面,请使用system 用户或者你创建的数据库用户进行测试,显示测试成功字样,则表示 OK。

weiyigeek.top-验证实例连接

步骤 05.最后,配置TNS网络服务别名即可。

weiyigeek.top-创建一个网络服务别名

实际上,你也可以通过直接修改C:apporacleproduct12.2.0dbhome_1networkadmintnsnames.ora 配置来替代上述操作,更方便简洁,但需特别注意文件权限。

ITGEEKDB_TEST =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.228.132)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = itgeekdb)
    )
  )

步骤 06.然后,使用 tnsping 验证 TNS 连接别名。

$ tnsping itgeekdb_test
已使用的参数文件:
C:apporacleproduct12.2.0dbhome_1networkadminsqlnet.ora
已使用 TNSNAMES 适配器来解析别名
尝试连接 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.228.132)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = itgeekdb)))
OK (0 毫秒)

步骤 07.最后,使用 sqlplus 或者 navicat 工具连接到数据库中。

知识扩展

静态注册 & 动态注册

不知道眼尖的看友是否注意到,LISTENER1522 监听器服务 itgeekdb 实例状态显示为UNKNOWN值,表明此服务是静态注册的设置,监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在;当然我们也可也通过命令方式来设置动态注册,从而这样不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。

动态注册

    :数据库实例启动时,会自动向监听器注册服务信息。
# 首先,修改 tnsnames.ora 文件,手动新添加下ITGEEKDB数据库TNS名称信息
ITGEEKDB1522 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = itgeekdb)
    )
  )

LISTENER_ITGEEKDB1522 =
  (ADDRESS = (PROTOCOL = TCP)(HOST = oracle-histdb)(PORT = 1522))

# 其次,使用 sqlplus 命令登录到 itgeekdb 数据库 sys 用户中,指定监听参数(方式1)
SYS@itgeekdb 2025-04-21 14:38:58> alter system set local_listener=LISTENER_ITGEEKDB1522;
SYS@itgeekdb 2025-04-21 14:40:42> alter system register;  -- 强制动态注册立即执行,而不必等待 PMON 的下次自动注册
SYS@itgeekdb 2025-04-21 14:40:57> show parameter register;
NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
hs_autoregister                      boolean                TRUE
# 或者
# 使用方式2,从而不用配置 tnsnames.ora 文件
# alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=oracle-histdb)(PORT=1522))';

# 最后,重启监听 LISTENER1522 监听,便可查询到我们 服务 "ITGEEKDB",实例 "itgeekdb"为状态 READY
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522

静态注册

    :需要在 listener.ora 文件中手动配置服务信息,主要用于特殊情况(如数据库未启动时仍需连接监听器)。
# C:apporacleproduct12.2.0dbhome_1networkadminlistener.ora
# 添加静态注册
SID_LIST_LISTENER1522 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = ITGEEKDB)
      (ORACLE_HOME =C:apporacleproduct12.2.0dbhome_1)
      (SID_NAME = ITGEEKDB)
    )
  )

# 最后,重启监听 LISTENER1522 监听,便可查询到我们 实例 "ITGEEKDB", 状态 UNKNOWN, 包含此服务的 1 个处理程序
lsnrctl.exe stop LISTENER1522
lsnrctl.exe start LISTENER1522

weiyigeek.top-动态注册和静态注册在实例状态区别

以下是 Oracle 监听器动态注册和静态注册的区别对比表:

对比项 动态注册 静态注册
基本概念 由数据库实例自动向监听器注册服务信息,是 Oracle 推荐的方式(特别是 10g 之后版本),由数据库自动管理 需要在 listener.ora 中手动配置服务信息,主要用于特殊情况(如数据库未启动时仍需连接监听器)
依赖文件 即使没有 listener.ora 文件也能工作(默认监听 1521 端口) 必须配置 listener.ora 文件
服务状态 显示为 READY 状态 显示为 UNKNOWN 状态
注册时机 由 PMON 进程每分钟自动注册一次 监听器启动时立即注册(无需数据库实例运行)
远程启动数据库 不支持远程启动数据库(必须至少 MOUNT 状态才能注册) 支持远程登录并启动数据库(STARTUP 命令)
数据库状态要求 数据库必须至少启动到 MOUNT 状态才能注册 无需数据库实例运行即可注册
配置内容 无需 SID_LIST 配置(自动注册实例和服务名) 必须手动配置 SID_LIST(包括协议、主机、端口、实例名等)
适用场景 推荐用于生产环境(自动维护服务状态) 常用于特殊需求(如远程启动、ASM 实例、RAC 环境等)
灵活性 更灵活(自动适应服务变化) 较不灵活(需手动维护配置)
典型配置示例 无需特殊配置(默认动态注册) SID_LIST_LISTENER =   (SID_LIST =     (SID_DESC = (GLOBAL_DBNAME = ORCL)       (SID_NAME = ORCL)     )   )
查看命令 lsnrctl status 显示服务状态为 "READY" lsnrctl status 显示服务状态为 "UNKNOWN"

加入:作者【全栈工程师修炼指南】星球

『 全栈工程师修炼指南』星球,主要涉及全栈工程师(Full Stack Development)实践文章,包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生(Cloud Native)、物联网工业控制(IOT)、人工智能Ai,从业书籍笔记,人生职场认识等方面资料或文章。

Q: 加入作者【全栈工程师修炼指南】星球后有啥好处?

✅ 将获得作者最新工作学习实践文章以及网盘资源。 ✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友,也可单次购买)。 ✅ 将获得作者专门答疑学习交流群,解决在工作学习中的问题。 ✅ 将获得作者远程支持(在作者能力范围内且合规)。

目前新人仅需 69 元即可加入作者星球,数量有限,期待你的加入!

相关推荐