外观
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监听器故障排查
常见故障类型
- 监听器无法启动
- 监听器服务不可用
- 客户端连接超时
- 监听器崩溃
故障排查步骤
- 检查监听器状态:
lsnrctl status - 查看监听器日志:
$ORACLE_HOME/network/log/listener.log - 检查网络连接:
ping hostname、telnet hostname 1521 - 验证配置文件:
$ORACLE_HOME/network/admin/listener.ora - 检查端口占用:
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 LISTENER2Q4: 监听器日志文件过大怎么办?
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 = OFFQ8: 监听器安全加固有哪些措施?
A8: 安全加固措施:
- 启用管理员访问限制:
ADMIN_RESTRICTIONS_LISTENER = ON - 配置 TCP 验证和访问控制
- 启用网络加密
- 限制监听器运行权限
- 定期更新 Oracle 补丁
Q9: 如何迁移监听器配置到新服务器?
A9: 迁移步骤:
- 备份原服务器的 listener.ora 文件
- 在新服务器上创建相同的目录结构
- 复制并修改 listener.ora 文件,更新主机名等参数
- 启动监听器并验证服务注册
Q10: 监听器性能瓶颈如何识别和解决?
A10: 识别和解决方法:
- 监控监听器响应时间
- 检查连接队列大小和超时设置
- 分析监听器日志中的错误模式
- 适当调整监听器配置参数
- 考虑使用多个监听器分散负载
