Skip to content

Oracle 监听器管理

监听器基本概念

监听器的作用

  • 接收客户端连接请求并转发给相应的数据库实例
  • 管理数据库服务的注册和发现
  • 提供连接状态监控和管理功能

监听器的类型

  • 静态监听器:通过 listener.ora 配置文件手动配置服务
  • 动态监听器:通过数据库实例自动注册服务

监听器配置文件

listener.ora 配置文件

txt
# 基本监听器配置
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

# 静态服务注册
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = ORCL)
      (ORACLE_HOME = /u01/app/oracle/product/19.3.0/dbhome_1)
    )
  )

# 高级配置选项
ADR_BASE_LISTENER = /u01/app/oracle
INBOUND_CONNECT_TIMEOUT_LISTENER = 120

配置参数说明

  • ADDRESS:监听器监听地址,包含协议、主机名和端口
  • SID_LIST:静态服务注册配置
  • ADR_BASE_LISTENER:自动诊断存储库基目录
  • INBOUND_CONNECT_TIMEOUT_LISTENER:入站连接超时时间

监听器管理命令

启动、停止、重启监听器

bash
# 启动监听器
lsnrctl start

# 停止监听器
lsnrctl stop

# 重启监听器
lsnrctl reload

# 状态检查
lsnrctl status

监听器状态查看

bash
# 详细状态
lsnrctl status LISTENER

# 服务状态
lsnrctl services

# 版本信息
lsnrctl version

监听器追踪

bash
# 启用追踪
lsnrctl set trc_level admin

# 禁用追踪
lsnrctl set trc_level off

监听器故障排查

常见故障类型

  • 监听器无法启动
  • 监听器服务不可用
  • 客户端连接超时
  • 监听器崩溃

故障排查步骤

  1. 检查监听器状态:lsnrctl status
  2. 查看监听器日志:$ORACLE_HOME/network/log/listener.log
  3. 检查网络连接:ping hostnametelnet hostname 1521
  4. 验证配置文件:$ORACLE_HOME/network/admin/listener.ora
  5. 检查端口占用:netstat -tuln | grep 1521

故障排查命令

bash
# 检查端口占用
netstat -tuln | grep 1521

# 检查监听器进程
ps -ef | grep tnslsnr

# 查看监听器日志
tail -f $ORACLE_HOME/network/log/listener.log

监听器安全配置

访问控制

txt
# listener.ora 中添加访问控制
ADMIN_RESTRICTIONS_LISTENER = ON

# 配置 TCP 验证
TCP.VALIDNODE_CHECKING = YES
TCP.INVITED_NODES = (192.168.1.0/24, 10.0.0.0/8)
TCP.EXCLUDED_NODES = (192.168.1.100)

加密配置

txt
# 启用网络加密
SQLNET.ENCRYPTION_SERVER = required
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256, AES192, AES128)

认证配置

txt
# 启用密码文件认证
SQLNET.AUTHENTICATION_SERVICES = (BEQ, TCPS)

监听器性能优化

连接超时配置

txt
# 入站连接超时
INBOUND_CONNECT_TIMEOUT_LISTENER = 60

# SQL*Net 超时
SQLNET.INBOUND_CONNECT_TIMEOUT = 60

队列大小配置

txt
# 连接队列大小
QUEUESIZE_LISTENER = 100

监听器进程优化

  • 调整监听器进程优先级
  • 配置适当的内存分配
  • 定期重启监听器以释放资源

版本差异

Oracle 11g 及之前版本

  • 主要使用静态注册
  • 监听器配置相对简单
  • 不支持某些高级安全功能

Oracle 12c 及之后版本

  • 增强的动态注册功能
  • 支持统一审计
  • 改进的安全特性
  • 更好的性能监控

Oracle 19c 特性

  • 增强的网络加密
  • 改进的连接管理
  • 更好的故障诊断

常见问题(FAQ)

Q1: 监听器启动失败怎么办?

A1: 检查以下几点:

  • 确认 listener.ora 配置文件语法正确
  • 检查端口是否被占用
  • 验证 ORACLE_HOME 和 ORACLE_SID 环境变量设置正确
  • 查看监听器日志获取详细错误信息

Q2: 客户端无法连接到数据库,提示监听器错误怎么办?

A2: 排查步骤:

  • 检查监听器是否运行:lsnrctl status
  • 验证网络连接:telnet 数据库服务器 IP 1521
  • 检查 tnsnames.ora 配置是否正确
  • 查看监听器日志中的错误信息

Q3: 如何配置多个监听器?

A3: 在 listener.ora 中定义多个监听器配置:

txt
# 主监听器
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1521))
    )
  )

# 备用监听器
LISTENER2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = hostname)(PORT = 1522))
    )
  )

然后分别管理:

bash
lsnrctl start LISTENER
lsnrctl start LISTENER2

Q4: 监听器日志文件过大怎么办?

A4: 解决方法:

  • 配置日志轮换:在 listener.ora 中设置 LOG_FILE_LISTENER
  • 定期归档和清理旧日志
  • 调整日志级别:lsnrctl set log_status off 临时关闭日志

Q5: 如何查看监听器当前连接数?

A5: 使用以下方法:

  • lsnrctl services 查看服务状态和连接数
  • 查询 V$SESSION 视图:SELECT COUNT(*) FROM V$SESSION WHERE TYPE = 'USER';
  • 使用网络工具:netstat -an | grep 1521 | wc -l

Q6: 监听器自动重启如何配置?

A6: 配置方法:

  • 在 Linux 系统中,将监听器添加到系统服务
  • 使用 crontab 定时检查监听器状态并重启
  • 配置 Oracle 集群ware 自动管理监听器

Q7: 如何禁用监听器的动态注册?

A7: 在 listener.ora 中添加:

txt
DYNAMIC_REGISTRATION_LISTENER = OFF

Q8: 监听器安全加固有哪些措施?

A8: 安全加固措施:

  • 启用管理员访问限制:ADMIN_RESTRICTIONS_LISTENER = ON
  • 配置 TCP 验证和访问控制
  • 启用网络加密
  • 限制监听器运行权限
  • 定期更新 Oracle 补丁

Q9: 如何迁移监听器配置到新服务器?

A9: 迁移步骤:

  • 备份原服务器的 listener.ora 文件
  • 在新服务器上创建相同的目录结构
  • 复制并修改 listener.ora 文件,更新主机名等参数
  • 启动监听器并验证服务注册

Q10: 监听器性能瓶颈如何识别和解决?

A10: 识别和解决方法:

  • 监控监听器响应时间
  • 检查连接队列大小和超时设置
  • 分析监听器日志中的错误模式
  • 适当调整监听器配置参数
  • 考虑使用多个监听器分散负载