大概率是DNS反向解析卡住:监听器默认对客户端IP执行gethostbyaddr查询,若/etc/resolv.conf中配置了不可达DNS服务器,每次查询阻塞5秒并重试一次,共延迟10秒;可通过注释无效nameserver或在sqlnet.ora中设置NAME.DIRECTORY_PATH=(TNSNAMES,EZCONNECT)禁用DNS解析。

监听进程还在,但连接超时 5–10 秒
这大概率是 DNS 反向解析卡住。Oracle 监听器在客户端建立连接时,默认会尝试对客户端 IP 做反向 DNS 查询(gethostbyaddr),如果配置了不可达的 DNS 服务器,每次查询会阻塞 5 秒,失败后重试一次,直接叠加成 10 秒延迟。
检查 /etc/resolv.conf(Linux)或 C:\Windows\System32\drivers\etc\hosts + DNS 设置(Windows),确认所有 nameserver 都能正常响应 ping 和 nslookup。若某条不可达,注释掉它。
更稳妥的做法是在 $ORACLE_HOME/network/admin/sqlnet.ora 中强制禁用 DNS 解析:
NAME.DIRECTORY_PATH=(TNSNAMES, EZCONNECT)
这样监听器会跳过 DNS 查找,只查本地 tnsnames.ora 或连接串里的 IP/端口,避免任何网络依赖。
监听状态显示正常,但客户端报 ORA-12541
表面看 lsnrctl status 有输出、进程也在,但客户端仍连不上,常见原因不是监听“没开”,而是它根本没收到包——多半被拦在半路。
按顺序排查以下几点:
- 用
netstat -tuln | grep :1521(Linux)或netstat -ano | findstr :1521(Windows)确认端口是否真由tnslsnr进程监听,而非其他程序(如残留的 Java 服务、测试工具)占用了 1521 - 检查防火墙:Linux 上临时关掉
systemctl stop firewalld;Windows 上确认入站规则放行 TCP 1521 - 验证监听绑定地址:打开
listener.ora,确认HOST值不是localhost或127.0.0.1—— 这会导致只监听本地回环,外部无法访问 - 如果服务器有多个网卡,建议显式写成实际对外 IP,或改用主机名并确保
/etc/hosts(Linux)或hosts文件(Windows)里有对应解析
监听日志暴涨导致启动/响应变慢
监听日志文件($ORACLE_HOME/network/log/listener.log 或 Windows 下 $ORACLE_HOME\diag\tnslsnr\<hostname>\listener\trace\listener.log</hostname>)一旦超过 2GB,尤其到 4GB+,tnslsnr 在写日志、轮转、甚至启动时都会明显卡顿,PL/SQL 登录可能等 3 分钟以上。
不要直接 rm listener.log 或清空文件——监听器可能正持锁写入,强行操作易引发异常。
安全做法是:
- 先停监听:
lsnrctl stop - 重命名日志:
mv listener.log listener.log.bak.$(date +%Y%m%d) - 再启动:
lsnrctl start - 确认正常后,再删掉旧备份(如
rm listener.log.bak.*)
长期建议启用日志轮转:在 listener.ora 加入
LOGGING_LISTENER = ON<br>LOG_DIRECTORY_LISTENER = $ORACLE_HOME/network/log<br>LOG_FILE_LISTENER = listener<br>TRACE_LEVEL_LISTENER = USER
并配合系统级 logrotate 或 Windows 任务计划定期归档。
监听启动失败且反复退出
Windows 上常见报错:“服务启动后停止”,Linux 上 ps -ef | grep tnslsnr 看不到进程。这时别急着重启,先看根本原因。
关键检查点:
- 查监听日志末尾是否有
TNS-12545或TNS-01150—— 很可能是listener.ora里写的HOST名已失效(比如主机名改过,但配置没同步) - Windows 注册表中
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleXXXTNSListener\ImagePath是否为空或路径错误(常见于多版本共存或卸载残留) - Linux 下检查
$ORACLE_HOME权限是否被误改,tnslsnr可执行文件是否可读可执行(ls -l $ORACLE_HOME/bin/tnslsnr) - 用
strace -f -T -y tnslsnr(Linux)或 Process Monitor(Windows)捕获启动瞬间的系统调用,看卡在哪一个 open/read/mmap 操作上
最易被忽略的是:监听器启动依赖数据库实例注册,而实例本身没起来(sqlplus / as sysdba 连不上),会导致监听看似启动成功,实则无法转发连接请求——此时 lsnrctl status 里看不到你的服务名,必须先确保数据库实例已 startup。


















