温馨提示×

ubuntu lsnrctl故障排查方法

小樊
40
2026-01-05 16:18:19
栏目: 智能运维

Ubuntu 上 lsnrctl 故障排查步骤

一 快速定位流程

  • 确认命令可用与权限:执行 which lsnrctl;若未找到,说明 Oracle 未安装PATH 未包含 $ORACLE_HOME/bin。检查权限:ls -l $(which lsnrctl),必要时用 sudo chmod +x 或以具备权限的用户执行。
  • 检查环境变量:执行 echo $ORACLE_HOMEecho $ORACLE_SIDecho $PATH,确保已正确设置(建议写入 ~/.bashrc~/.bash_profilesource 使其生效)。
  • 查看监听状态与启停:依次执行 lsnrctl statuslsnrctl startlsnrctl stop;若提示 “Listener does not currently exist” 或启动失败,转下一步。
  • 核对配置文件:$ORACLE_HOME/network/admin/listener.ora 是否存在且语法正确(括号匹配、PROTOCOL/HOST/PORT 等)。
  • 检查端口占用:执行 netstat -tulnp | grep 1521(或 ss/tcpdump),确认 1521 未被其他进程占用。
  • 网络与防火墙:用 ping 测试连通性,检查 ufw/iptables 是否放行 1521
  • 查阅日志:优先查看 $ORACLE_HOME/diag/tnslsnr//listener/alert/log.xml,辅以 $ORACLE_HOME/network/log/listener.log 获取详细错误。
  • 客户端解析校验:如涉及客户端连接,使用 tnsping <服务名> 验证解析与服务可达性。

二 常见错误与修复要点

  • 命令未找到或 ORACLE_HOME 未设置:安装 Oracle 或将 $ORACLE_HOME/bin 加入 PATH;在 ~/.bashrc 中添加并 source
    • export ORACLE_HOME=/opt/oracle/product/19.0.0/dbhome_1
    • export PATH=$ORACLE_HOME/bin:$PATH
  • 权限被拒绝(TNS-12555/TNS-00525):多因 /var/tmp/.oracle 目录权限不当。修复:
    • chown -R oracle:dba /var/tmp/.oracle
    • chmod 777 /var/tmp/.oracle(或更严格的权限策略)
  • 端口冲突(TNS-12541 等):1521 被占用导致监听无法绑定。处理:
    • 查找占用进程:netstat -tulnp | grep 1521,结束对应 PID 后重启监听。
  • 配置文件错误:listener.ora/tnsnames.ora 语法错误或关键参数缺失(如 PROTOCOL、HOST、PORT、SERVICE_NAME)。处理:
    • 用示例模板核对,修正后 lsnrctl stop → lsnrctl start;必要时用 tnsping 验证。
  • 日志与告警:若仍失败,打开 $ORACLE_HOME/diag/tnslsnr//listener/alert/log.xml 定位具体错误码与行号。

三 配置文件与日志路径速查

  • 监听器配置:$ORACLE_HOME/network/admin/listener.ora
  • 客户端解析:$ORACLE_HOME/network/admin/tnsnames.ora
  • 监听日志(XML):$ORACLE_HOME/diag/tnslsnr//listener/alert/log.xml
  • 监听日志(文本):$ORACLE_HOME/network/log/listener.log
  • 传统日志目录(部分版本):$ORACLE_HOME/log(如 listener.log 等)

四 一键自检脚本示例

#!/usr/bin/env bash
set -e

echo "=== 1) 检查命令与权限 ==="
which lsnrctl || { echo "lsnrctl 未找到,请检查 ORACLE_HOME/bin 与 PATH"; exit 1; }
ls -l "$(which lsnrctl)"

echo "=== 2) 检查环境变量 ==="
for v in ORACLE_HOME ORACLE_SID PATH; do
  printf "%-12s = %s\n" "$v" "${!v}"
done

echo "=== 3) 检查监听状态 ==="
lsnrctl status || true

echo "=== 4) 检查 1521 端口占用 ==="
ss -lntp | grep -E ':(1521|152[0-9])' || echo "1521 未被占用"

echo "=== 5) 常用日志文件是否存在 ==="
ls -l "$ORACLE_HOME/diag/tnslsnr/$(hostname)/listener/alert/log.xml" 2>/dev/null || echo "XML 告警日志未找到"
ls -l "$ORACLE_HOME/network/log/listener.log" 2>/dev/null || echo "文本监听日志未找到"

将脚本保存为 check_lsnr.sh,执行:bash check_lsnr.sh

五 实用建议

  • 始终以 oracle 用户执行监听相关操作,避免权限混乱。
  • 修改环境变量后执行 source ~/.bashrc 或重新登录,确保生效。
  • 变更 listener.ora/tnsnames.ora 后,使用 lsnrctl stop → lsnrctl start 重启监听。
  • 生产环境谨慎使用 chmod 777,优先采用最小权限(如 oracle:dba 与 700/750 目录权限)。
  • 若仍无法恢复,收集并附上:lsnrctl status 输出、log.xml 关键片段、端口占用情况、listener.ora 相关片段,便于进一步定位。

0