Ubuntu 上 lsnrctl 网络连接问题排查与修复
一 快速自检清单
- 确认监听器运行状态:执行 lsnrctl status;若未运行,执行 lsnrctl start。
- 校验环境变量:确保 ORACLE_HOME、ORACLE_SID 正确并已加入 PATH,例如:
export ORACLE_HOME=/opt/oracle/product/19c/dbhome_1
export ORACLE_SID=orcl
export PATH=$PATH:$ORACLE_HOME/bin
- 检查监听端口连通性:在服务器上执行 ss -lntp | grep 1521 或 netstat -tulnp | grep 1521;在客户端用 telnet 服务器IP 1521 或 nc -vz 服务器IP 1521 测试。
- 开放防火墙端口:
Ubuntu 常用 ufw:sudo ufw allow 1521/tcp;
或 firewalld:sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload;
或 iptables:sudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPT。
- 查看日志定位:
监听器日志:$ORACLE_HOME/network/log/listener.log;
数据库告警日志:$ORACLE_HOME/diag/rdbms/数据库名/实例名/trace/alert_实例名.log。
二 常见错误与对应处理
| 错误码或现象 |
含义与常见原因 |
处理要点 |
| TNS-12541: TNS:no listener |
监听器未启动/端口不对/被防火墙拦截 |
启动监听器:lsnrctl start;核对 listener.ora 的 HOST/PORT;放行 1521/tcp 防火墙 |
| TNS-12560: TNS:protocol adapter error |
客户端/服务器版本或网络异常 |
检查网络与版本兼容,确保监听端口可达 |
| TNS-12537: TNS:connection closed |
目标实例未启动或不可用 |
启动数据库实例(如 sudo systemctl start oracle-xe 或等效方式) |
| TNS-12162: TNS:net service name is incorrectly specified |
连接串/服务名配置错误 |
修正 tnsnames.ora 或连接字符串 |
| TNS-12154: TNS:could not resolve the connect identifier specified |
无法解析连接标识 |
检查 tnsnames.ora 与 DNS/hosts 解析 |
| TNS-00515: Lost connection to the Oracle server |
网络中断/服务器过载 |
排查网络稳定性与服务器负载 |
| 启动时报 Address already in use |
端口被占用 |
用 ss/lsof 查占用进程并终止,或更改 listener.ora 的 PORT 后重启监听器 |
三 配置与网络关键点
- 正确配置 listener.ora:确保 HOST 填写服务器可被客户端解析的 IP 或主机名,PORT 与客户端一致(默认 1521)。示例:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = your_hostname_or_ip)(PORT = 1521))
)
)
修改后执行 lsnrctl stop && lsnrctl start(或仅 lsnrctl reload 以热加载)。
- 修改监听端口:编辑 listener.ora 的 PORT(如改为 1522),保存后重启监听器并用 lsnrctl status 验证新端口监听。
- 主机名与解析:若 HOST 使用主机名,确保客户端可解析(/etc/hosts 或 DNS 正确);否则直接使用 服务器IP 更稳妥。
- 权限与临时目录:确保 /tmp 权限为 drwxrwxrwt,且 Oracle 相关目录与文件可被 Oracle 用户访问。
四 一键式排查命令脚本
- 查看监听状态与监听地址:
lsnrctl status
ss -lntp | grep 1521 || netstat -tulnp | grep 1521
- 启动/重启监听器:
lsnrctl stop && lsnrctl start
或仅重载配置
lsnrctl reload
- 客户端连通性测试:
telnet 服务器IP 1521 || nc -vz 服务器IP 1521
- 防火墙放行(按系统选择其一):
sudo ufw allow 1521/tcp
sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload
sudo iptables -A INPUT -p tcp --dport 1521 -j ACCEPT
- 端口占用排查与处理:
sudo lsof -i :1521
sudo kill -9 # 确认进程无用后再终止
- 日志实时查看:
tail -f $ORACLE_HOME/network/log/listener.log
tail -f $ORACLE_HOME/diag/rdbms///trace/alert_*.log