Oracle 19c 监听器完全指南

Oracle 19c 监听器完全指南

1 监听器简介

ORACLE的监听器(Listener)是数据库与客户端之间的桥梁,负责接收并处理客户端的初始连接请求。一旦连接建立成功,监听器便将连接转交给对应的数据库进程,后续通信不再依赖监听器。换言之,监听器仅在连接建立的瞬间发挥作用,即使之后监听器进程停止,已建立的连接也不会受影响。

监听器的注册模式分为动态注册静态注册两种,理解二者的区别是掌握监听器的核心。

1.1 动态注册 (Dynamic Service Registration)

动态注册是指数据库实例在启动时,通过内部进程自动将服务信息注册到监听器。在Oracle 12c之前的版本中,这一任务由PMON进程完成;从Oracle 12c开始,这一职责移交给了LREG(Listener Registration)进程

动态注册的核心机制如下:

  • 数据库启动时,LREG进程会根据初始化参数文件(init.ora或SPFILE)中的INSTANCE_NAMESERVICE_NAMES参数,将实例和服务信息自动注册到监听器。

  • SERVICE_NAMES未显式设置,数据库将使用DB_NAMEDB_DOMAIN拼接生成默认服务名。

  • LREG进程默认每60秒执行一次发现例程(discovery routine)。如果监听器在数据库启动之后才启动,动态注册最多需要等待60秒才能完成。

重要建议 :在listener.ora中显式设置SERVICE_NAMESINSTANCE_NAME是最佳实践。否则,若监听器在数据库运行后重启,动态注册信息可能丢失。如需立即注册,可执行以下命令强制LREG进程立即注册:

复制代码
SQL> ALTER SYSTEM REGISTER;

查看动态注册状态 :通过lsnrctl status命令查看服务状态,显示为READY即表示该服务为动态注册。

1.2 静态注册 (Static Service Registration)

静态注册是指监听器启动时,根据listener.ora文件中预定义的配置信息注册服务,与数据库实例当前是否处于运行状态无关。

为何在已有动态注册的情况下还需静态注册?主要原因包括:

  1. 需要在数据库实例未启动时也能响应连接请求(如远程启动数据库)

  2. 监听器重启后无需等待60秒即可提供服务

  3. 某些管理工具或特定场景需要稳定的服务名注册

静态注册配置示例listener.ora):

复制代码
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

查看静态注册状态 :通过lsnrctl status命令查看服务状态,显示为UNKNOWN即表示该服务为静态注册。

1.3 动态注册 vs 静态注册 对比

对比维度 动态注册 静态注册
注册时机 数据库启动后由LREG进程自动注册 监听器启动时读取listener.ora注册
依赖条件 数据库实例必须处于运行状态 无需数据库实例运行
注册延迟 最多60秒,可手动ALTER SYSTEM REGISTER立即触发 无延迟,监听器启动即注册
服务状态显示 READY UNKNOWN
适用场景 常规连接、负载均衡、RAC环境 远程启动数据库、监听器重启后的快速恢复

2 Oracle 19c 监听器核心新特性

Oracle 19c在监听器管理方面引入了多项重要改进,显著提升了运维便捷性。

2.1 日志自动轮转(Log File Segmentation)【核心新特性】

在19c之前的版本中,监听器的TXT格式日志文件不会自动轮转,长期运行可能导致日志文件无限增长,给运维带来沉重负担。

Oracle 19c引入了两个新参数来控制日志文件的分段与数量:

参数 说明 默认值
LOG_FILE_SIZE_listener_name 指定每个日志文件段的大小(单位:MB) 300 MB
LOG_FILE_NUM_listener_name 指定日志文件段的最大数量 无默认值,不设则无限增长

配置示例listener.ora):

复制代码
LOG_FILE_SIZE_LISTENER = 10
LOG_FILE_NUM_LISTENER = 8

以上配置表示:每个日志文件最大10MB,最多保留8个历史文件,超出时自动删除最旧的日志段。

注意 :修改这些参数后,需要重启监听器才能生效。

验证效果

复制代码
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 19-FEB-2021 15:20:51

STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                19-FEB-2021 15:20:51
Uptime                    0 days 0 hr. 0 min. 0 sec
Listener Log File         /u01/app/oracle/diag/tnslsnr/p19c/listener/alert/log.xml
...
The command completed successfully

配置生效后,TXT和XML格式的监听器日志均支持自动轮转。XML日志文件达到设定大小限制后,两种格式的日志会同时轮转。

复制代码
$ du -sh /u01/app/oracle/diag/tnslsnr/p19c/listener/trace/*
2.0M  listener_1.log
488K  listener_2.log
192K  listener.log

2.2 多租户架构下的GUID服务注册【核心新特性】

Oracle 19c作为多租户架构(Multitenant)的成熟版本,监听器中会自动为CDB和每个PDB注册一个以GUID(全局唯一标识符)命名的服务。这是Oracle 19c及更高版本的固有行为,用于支持Data Guard、GoldenGate、远程PDB复制等内部管理功能。

复制代码
$ lsnrctl status

Services Summary...
Service "86b637b62fdf7a65e053f706e80a27ca" has 1 instance(s).   # CDB$ROOT的GUID
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "2b6f176f0f10db3be0637885a8c06e04" has 1 instance(s).   # PDB的GUID
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclpdb" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...

这些GUID服务名与常规服务名共存,互不冲突。普通用户连接仍使用用户友好的服务名(如orclorclpdb),而Oracle内部组件则使用GUID服务名以确保唯一性。

2.3 连接速率限制(Rate Limit)【安全增强】

Oracle 19c支持在监听器层面配置连接速率限制,用于防止拒绝服务(DoS)攻击或控制因应用服务器重启等导致的登录风暴(logon storm)。

通过在listener.ora中配置相关参数,可以限制单位时间内来自同一客户端的连接请求数量,从而增强数据库的安全性。

2.4 监听器管理认证【安全增强】

Oracle 19c强制要求监听器管理操作需要通过本地操作系统认证。这意味着只有启动监听器的操作系统用户才能对其进行管理(如停止、重载等)。这一机制有效防止了未经授权的监听器管理操作,避免了潜在的拒绝服务攻击、审计数据丢失或非授权重配置等安全风险。

2.5 扩展的Easy Connect语法

Oracle 19c对Easy Connect连接语法进行了扩展,简化了常见连接场景的配置,减少了对tnsnames.ora文件的依赖。新版Easy Connect语法支持更多选项,例如可直接在连接字符串中指定连接超时、负载均衡策略等参数,部署和配置更加便捷。


3 监听器操作命令

以下为Oracle 19c环境下监听器管理的常用命令及输出示例。

3.1 查看监听器版本

复制代码
$ lsnrctl version

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUL-2019 03:01:00
Copyright (c) 1991, 2019, Oracle. All rights reserved.

3.2 查看监听器状态

复制代码
$ lsnrctl status

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUL-2019 01:09:40
Copyright (c) 1991, 2019, Oracle. All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=host01.example.com)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                10-JUL-2019 01:32:04
Uptime                    4 days 23 hr. 37 min. 36 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/host01/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=host01.example.com)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully

3.3 查看服务详情

复制代码
$ lsnrctl services

LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 15-JUL-2019 01:09:40
Services Summary...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
    Handler(s):
      "DEDICATED" established:1 refused:0 state:ready
         LOCAL SERVER
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
    Handler(s):
      "D000" established:0 refused:0 current:0 max:1022 state:ready
         DISPATCHER <machine: host01, pid: 11136>
         (ADDRESS=(PROTOCOL=tcp)(HOST=host01)(PORT=49712))

3.4 启动与停止监听器

复制代码
# 启动默认监听器(LISTENER)
$ lsnrctl start

# 启动指定名称的监听器
$ lsnrctl start LISTENER2

# 停止监听器
$ lsnrctl stop

# 重新加载配置(无需停止监听器)
$ lsnrctl reload

reload命令会重新读取listener.ora文件,同时动态注册的服务会被取消注册并重新注册,不会中断现有连接。

3.5 监听器管理完整命令列表

复制代码
$ lsnrctl help

The following operations are available
An asterisk (*) denotes a modifier or extended command:

start        stop         status       services
servacls     version      reload       save_config
trace        spawn        quit         exit
set*         show*

常用命令说明

命令 功能
start 启动监听器
stop 停止监听器
status 查看监听器状态摘要
services 查看详细的服务注册信息
reload 重新加载listener.ora配置,无需重启
save_config 将当前运行时配置保存到listener.ora
servacls 查看服务的ACL信息(19c支持)
version 显示监听器版本

4 多IP与多监听器配置实践

4.1 单个监听器绑定多个IP和端口

复制代码
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.20.3)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.20.5)(PORT = 1523))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

修改后需重启监听器使配置生效:

复制代码
$ lsnrctl stop
$ lsnrctl start

客户端TNS配置(连接至端口1523):

复制代码
TEST3 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.20.5)(PORT = 1523))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

4.2 创建新的监听器监控其他数据库

复制代码
LISTENER_NEW =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.20.6)(PORT = 1524))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

SID_LIST_LISTENER_NEW =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (PROGRAM = extproc)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = testdb)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = testdb)
    )
  )

启动新监听器:

复制代码
$ lsnrctl start LISTENER_NEW

4.3 动态注册到非默认监听器

动态注册默认只注册到默认的监听器(名称为LISTENER、端口为1521、协议为TCP)。如果需要向非默认监听器注册,则需要配置LOCAL_LISTENER参数:

复制代码
SQL> ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.20.6)(PORT=1524))';
SQL> ALTER SYSTEM REGISTER;

LOCAL_LISTENERREMOTE_LISTENER参数控制数据库实例向监听器"自报家门"的地址,设错会导致LREG注册失败。


5 通过监听器远程管理数据库

Oracle 19c支持通过监听器远程启动和关闭数据库,但需满足以下条件:

  1. 必须配置静态注册(动态注册无法用于远程关闭数据库)

  2. 连接用户需具备SYSDBASYSOPER权限

静态注册配置listener.ora):

复制代码
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)
      (SID_NAME = orcl)
    )
  )

远程关闭数据库示例

复制代码
$ sqlplus sys/password@orcl_remote as sysdba
SQL> SHUTDOWN IMMEDIATE;

远程启动数据库

复制代码
$ sqlplus sys/password@orcl_remote as sysdba
SQL> STARTUP;

重要提示:远程管理功能依赖于监听器的静态注册。若仅配置动态注册,数据库未启动时监听器无法获知服务信息,将无法建立连接。


6 总结

Oracle 19c在监听器管理方面的核心演进可归纳为:

  1. 日志管理革新 :通过LOG_FILE_SIZE_*LOG_FILE_NUM_*参数实现日志自动轮转,彻底解决了监听器日志无限增长的历史难题。

  2. 多租户深度集成:GUID服务名自动注册成为19c多租户架构的标志性特征,为CDB/PDB级别的精细化管理提供底层支撑。

  3. 安全能力增强:支持连接速率限制和监听器管理认证,有效防范DoS攻击和未授权管理操作。

  4. 易用性提升 :扩展的Easy Connect语法和servacls等新命令,降低了连接配置与管理复杂度。

  5. 架构稳定性 :LREG进程(取代PMON)负责动态注册,默认60秒轮询周期配合ALTER SYSTEM REGISTER即时触发机制,确保了服务注册的可靠性与灵活性。

无论是从传统版本迁移到19c,还是新建19c环境,掌握以上监听器特性都是确保数据库高可用与运维效率的关键。