温馨提示×

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 在多台主机统一执行启停与状态校验,集中记录与回滚,适配灰度与多环境发布。 以上方案覆盖从单机到多机、从手工到自愈的运维闭环,便于纳入变更与值班体系。

0