先执行lsnrctl status确认监听器是否运行并显示注册服务,若提示“not currently running”则需lsnrctl start;再检查listener.ora中HOST是否为实际IP而非localhost,改后须lsnrctl reload;最后用telnet或nc验证端口可达性,并核对service_names与Navicat填写的服务名一致。
直接用 lsnrctl status 看监听注册状态
别急着开 navicat 测试连接,先确认监听器本身有没有真正“上岗”。执行 lsnrctl status 是最直接的验证方式——它会返回监听器当前监听的地址、端口,以及已注册的服务列表。如果输出里出现 the listener is not currently running,说明监听根本没启,lsnrctl start 才是第一步。
注意:这个命令必须在 Oracle 服务器上运行,且需以 oracle 用户或具备相应权限的用户执行。如果提示 command not found,说明环境变量 $ORACLE_HOME 没配好,或者没 source 过 Oracle 的 profile 脚本。
用 telnet 或 nc 验证端口是否可达
监听起来了,不等于远程能连上。关键要看目标端口(默认 1521)是否对外暴露。从 Navicat 所在机器发起测试:
- Windows:运行
telnet 192.168.x.x 1521(若提示未启用 telnet 功能,改用PowerShell -Command "Test-NetConnection 192.168.x.x -Port 1521") - macOS/Linux:运行
nc -zv 192.168.x.x 1521
如果连接失败或超时,问题一定出在网络层:可能是防火墙拦截、云服务器安全组未放行、监听绑定的是 127.0.0.1 而非实际 IP。此时 lsnrctl status 显示正常也没用——监听只听本地,别人敲门没人应。
检查 listener.ora 中的 ADDRESS 绑定地址
监听器是否监听真实网卡 IP,取决于 listener.ora 文件里的 ADDRESS 配置。常见错误是写成:
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
这会让监听只响应 127.0.0.1,远程必然失败。正确写法应为:
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.x.x)(PORT = 1521))
或更通用的:
(ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
改完后必须执行 lsnrctl reload(不是 restart),否则配置不生效。别漏掉这步,很多人改了文件却没重载,以为没用。
确认服务名与数据库实际注册一致
Navicat 填的 Service Name 必须和数据库实例向监听器注册的名字完全一致。查法很简单:
- 登录数据库执行:
SELECT value FROM v$parameter WHERE name = 'service_names'; - 如果结果为空或不符合预期,说明动态注册失败,可能因为
service_names参数被清空,或监听地址与数据库的local_listener不匹配
这时候不能只盯着 Navicat 配置改,得回看数据库侧的初始化参数和监听器日志($ORACLE_HOME/network/log/listener.log),里面常有注册失败的具体原因,比如 “TNS-12505: Service name is not registered”。


















