Oracle 19c 监听器完全指南
1 监听器简介
ORACLE的监听器(Listener)是数据库与客户端之间的桥梁,负责接收并处理客户端的初始连接请求。一旦连接建立成功,监听器便将连接转交给对应的数据库进程,后续通信不再依赖监听器。换言之,监听器仅在连接建立的瞬间发挥作用,即使之后监听器进程停止,已建立的连接也不会受影响。
监听器的注册模式分为动态注册 和静态注册两种,理解二者的区别是掌握监听器的核心。
1.1 动态注册 (Dynamic Service Registration)
动态注册是指数据库实例在启动时,通过内部进程自动将服务信息注册到监听器。在Oracle 12c之前的版本中,这一任务由PMON进程完成;从Oracle 12c开始,这一职责移交给了LREG(Listener Registration)进程。
动态注册的核心机制如下:
-
数据库启动时,LREG进程会根据初始化参数文件(
init.ora或SPFILE)中的INSTANCE_NAME和SERVICE_NAMES参数,将实例和服务信息自动注册到监听器。 -
若
SERVICE_NAMES未显式设置,数据库将使用DB_NAME和DB_DOMAIN拼接生成默认服务名。 -
LREG进程默认每60秒执行一次发现例程(discovery routine)。如果监听器在数据库启动之后才启动,动态注册最多需要等待60秒才能完成。
重要建议 :在listener.ora中显式设置SERVICE_NAMES和INSTANCE_NAME是最佳实践。否则,若监听器在数据库运行后重启,动态注册信息可能丢失。如需立即注册,可执行以下命令强制LREG进程立即注册:
SQL> ALTER SYSTEM REGISTER;
查看动态注册状态 :通过lsnrctl status命令查看服务状态,显示为READY即表示该服务为动态注册。
1.2 静态注册 (Static Service Registration)
静态注册是指监听器启动时,根据listener.ora文件中预定义的配置信息注册服务,与数据库实例当前是否处于运行状态无关。
为何在已有动态注册的情况下还需静态注册?主要原因包括:
-
需要在数据库实例未启动时也能响应连接请求(如远程启动数据库)
-
监听器重启后无需等待60秒即可提供服务
-
某些管理工具或特定场景需要稳定的服务名注册
静态注册配置示例 (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服务名与常规服务名共存,互不冲突。普通用户连接仍使用用户友好的服务名(如orcl、orclpdb),而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_LISTENER和REMOTE_LISTENER参数控制数据库实例向监听器"自报家门"的地址,设错会导致LREG注册失败。
5 通过监听器远程管理数据库
Oracle 19c支持通过监听器远程启动和关闭数据库,但需满足以下条件:
-
必须配置静态注册(动态注册无法用于远程关闭数据库)
-
连接用户需具备
SYSDBA或SYSOPER权限
静态注册配置 (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在监听器管理方面的核心演进可归纳为:
-
日志管理革新 :通过
LOG_FILE_SIZE_*和LOG_FILE_NUM_*参数实现日志自动轮转,彻底解决了监听器日志无限增长的历史难题。 -
多租户深度集成:GUID服务名自动注册成为19c多租户架构的标志性特征,为CDB/PDB级别的精细化管理提供底层支撑。
-
安全能力增强:支持连接速率限制和监听器管理认证,有效防范DoS攻击和未授权管理操作。
-
易用性提升 :扩展的Easy Connect语法和
servacls等新命令,降低了连接配置与管理复杂度。 -
架构稳定性 :LREG进程(取代PMON)负责动态注册,默认60秒轮询周期配合
ALTER SYSTEM REGISTER即时触发机制,确保了服务注册的可靠性与灵活性。
无论是从传统版本迁移到19c,还是新建19c环境,掌握以上监听器特性都是确保数据库高可用与运维效率的关键。