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.log2.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 successfully3.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 reloadreload命令会重新读取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_NEW4.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环境,掌握以上监听器特性都是确保数据库高可用与运维效率的关键。