Ubuntu lsnrctl使用案例分析
小樊
36
2026-01-09 13:54:41
Ubuntu 上 lsnrctl 使用案例精选
一 基础命令与快速巡检
- 以 oracle 用户执行,确保环境变量正确:export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1; export PATH=$ORACLE_HOME/bin:$PATH。常用命令:
- 查看状态:lsnrctl status(关注“Listener is running”、监听端口、已注册服务)
- 启停:lsnrctl start | stop
- 热生效:lsnrctl reload(修改 listener.ora 后优先使用)
- 服务注册详情:lsnrctl services(核对服务与实例映射)
- 日志定位:lsnrctl logfile;实时跟踪:tail -f $ORACLE_HOME/log/listener.log
- 连通性自检:lsnrctl ping(返回 OK 表示监听器工作正常)
- 端口占用:ss -lntp | grep 1521 或 sudo lsof -iUDP:1521 -iTCP:1521
- 防火墙放行(UFW):sudo ufw allow 1521/tcp
以上命令覆盖日常巡检与快速处置,适合作为变更前后与例行检查的“标准动作”。
二 典型故障案例与处置
- 案例一 客户端报 ORA-12541 TNS:no listener
- 现象:应用无法连库,提示无监听。
- 处置:
- lsnrctl status 确认监听器未运行 → lsnrctl start 启动;
- ss -lntp | grep 1521 检查端口是否被占用,必要时释放占用进程;
- 如修改过监听端口或新增服务,执行 lsnrctl reload 使配置生效;
- 复核防火墙与云安全组是否放行 1521/TCP。
- 案例二 主机名解析导致 TNS-12545
- 现象:日志出现 “Connect failed because target host or object does not exist”。
- 处置:
- 检查 listener.ora 与客户端 tnsnames.ora 中的 HOST 字段,优先使用可解析的主机名或 0.0.0.0/服务器内网 IP;
- 在服务器侧验证解析:getent hosts your_host;必要时修正 /etc/hosts 或 DNS。
- 案例三 启动监听报 TNS-12555 Permission denied
- 现象:lsnrctl start 失败,提示权限不足(常见于 IPC 套接字目录权限)。
- 处置:
- 检查 /var/tmp/.oracle 目录权限与属主,执行 chown -R oracle:dba /var/tmp/.oracle 或 chmod 1777 /var/tmp 后重试;
- 确认以 oracle 用户执行,而非 root。
- 案例四 多监听器端口冲突
- 现象:启动某监听器失败,提示地址已被使用。
- 处置:
- 使用 ss/lsof 确认冲突进程与端口;
- 在 listener.ora 中为不同监听器分配唯一端口,分别用 lsnrctl status [listener_name] 校验;
- 变更后用 lsnrctl reload 或 stop/start 使配置生效。
以上案例覆盖了最常见的监听不可用、解析错误、权限问题与端口冲突,步骤简洁可复用。
三 性能优化与运行时调优
- 基线观测:周期性执行 lsnrctl status / lsnrctl services,关注监听端口(常见 1521)、已注册服务、当前连接与排队情况;异常时先查日志与跟踪。
- 配置热生效:修改 listener.ora 后优先 lsnrctl reload,减少业务中断窗口;确需重启在低峰期执行 stop/start。
- 日志与跟踪:通过 lsnrctl logfile 定位日志;遇到握手慢、间歇性失败时短时开启 lsnrctl trace start,分析后 lsnrctl trace stop,避免日志膨胀。
- 服务模型:极高并发短连接场景可为特定 SID 启用 SHARED SERVER 模式(SERVER = SHARED),降低监听与后端进程开销;以专用服务器为主则保持 DEDICATED 并优化超时与重试。
- 系统层面:确认 1521/TCP 未被占用并放行防火墙;可按需优化 TCP 栈(如启用 TCP Fast Open)并保障 CPU/内存 与 I/O 能力。
上述做法能在不改动业务代码的前提下,提升监听层面的可用性与可观测性。
四 自动化运维与开机自启
- 脚本封装:以 oracle 用户封装 start/stop/status/restart,统一日志与返回码,便于 systemd/cron/Ansible 调用;脚本内显式设置 ORACLE_HOME/PATH,确保幂等与可移植。
- systemd 托管(推荐):创建 /etc/systemd/system/oracle-listener.service,示例要点:
- Description、After=network.target、Type=forking
- ExecStart=$ORACLE_HOME/bin/lsnrctl start;ExecStop=$ORACLE_HOME/bin/lsnrctl stop
- User=oracle;Group=oracle;Restart=on-failure;WantedBy=multi-user.target
- 执行:systemctl daemon-reload && systemctl enable --now oracle-listener
- 巡检与自愈:在 oracle 用户 crontab 中加入定时状态检查与有限重试自愈;结合 Monit/Nagios/Zabbix 依据返回码与关键字(如 READY)告警与恢复。
- 批量编排:使用 Ansible 在多台主机统一执行启停与状态校验,集中记录与回滚,适配灰度与多环境发布。
以上方案覆盖从单机到多机、从手工到自愈的运维闭环,便于纳入变更与值班体系。