news 2026/7/1 9:16:04

Oracle 19c 监听器完全指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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立即触发无延迟,监听器启动即注册
服务状态显示READYUNKNOWN
适用场景常规连接、负载均衡、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环境,掌握以上监听器特性都是确保数据库高可用与运维效率的关键。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 9:15:03

用C语言手搓一个递归下降语法分析器:以陈意云张昱习题3.1为例

用C语言实现递归下降语法分析器&#xff1a;从理论到实践的完整指南在编译原理的学习过程中&#xff0c;理解文法规则和掌握First/Follow集计算只是第一步。真正将理论知识转化为实际可运行的代码&#xff0c;才是检验学习成果的关键。本文将以陈意云张昱《编译原理》习题3.1为…

作者头像 李华
网站建设 2026/7/1 9:14:01

英文论文怎么翻译?5 种方案实测对比:从 Google 翻译到 AI 全文翻译

做研究、写论文、或者准备留学申请的时候&#xff0c;看英文文献几乎是绕不过去的事。问题不只是"看不懂"——很多人其实能用翻译工具把每句话翻出来&#xff0c;但真正卡住的是&#xff1a;翻译完之后&#xff0c;这篇文章还像一篇论文吗&#xff1f; 学术论文和普通…

作者头像 李华
网站建设 2026/7/1 9:09:50

智慧园区IP应急广播系统方案:物业通知、安防联动与多区域管理

智慧园区通常由办公楼、研发楼、生产配套区、商业服务区、地下停车场、园区道路、门岗、公共广场、设备机房和物业管理中心组成。与单栋建筑相比&#xff0c;园区空间更分散&#xff0c;人员流动更复杂&#xff0c;通知对象更多样&#xff0c;管理部门也更加多元。传统人工通知…

作者头像 李华
网站建设 2026/7/1 9:09:06

深入解析Java沙箱机制:从核心原理到现代应用安全实践

1. 项目概述&#xff1a;为什么Java安全与沙箱机制在今天依然至关重要最近在面试和带新人的过程中&#xff0c;我发现一个挺有意思的现象&#xff1a;很多有几年经验的Java开发者&#xff0c;对“应用安全”的理解还停留在“防止SQL注入”和“XSS攻击”的层面。当被问到“Java程…

作者头像 李华