ora-12541 根因是监听器绑定 localhost/127.0.0.1 导致远程不可达;需修改 listener.ora 中 host 为实际 ip 或 0.0.0.0,执行 lsnrctl reload,并验证端口可达及防火墙放行 1521。
ora-12541 不是监听服务没启动,而是它“只听自己说话”——监听进程在跑,但绑定地址是 localhost 或 127.0.0.1,远程请求根本进不来。改配置 + lsnrctl reload + 看 status 输出里的真实 host 值,这三步缺一不可。
检查 lsnrctl status 输出的 Address 行是否绑定了正确 IP
执行 lsnrctl status 后,重点看类似这样的行:
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.111.133)(PORT=1521))
如果看到的是 HOST=localhost 或 HOST=127.0.0.1,就坐实了问题根源。此时即使状态显示 READY,也只对本机有效。
- 本地
tnsping ORCLCDB或sqlplus /@ORCLCDB能通(走回环) - Navicat 从 Windows 连
192.168.x.x:1521必然失败 -
lsnrctl restart无效——它不加载新配置,只是重启旧绑定
修改 listener.ora 中的 HOST 值并 reload
路径在 $ORACLE_HOME/network/admin/listener.ora,找到类似段落:
LISTENER =<br> (DESCRIPTION_LIST =<br> (DESCRIPTION =<br> (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))<br> )<br> )
把 HOST = localhost 改成:
-
HOST = 192.168.111.133(服务器实际 IP,推荐) - 或
HOST = 0.0.0.0(监听所有接口,仅限可信内网) - 绝对不要留空、不要写错别字(如
locahost)、不要用未解析的主机名
改完必须执行 lsnrctl reload(不是 restart),让监听器热加载配置。
验证端口可达性与防火墙
lsnrctl status 显示正确 IP 后,还需确认客户端能真正触达该端口:
- Windows 客户端用
telnet 192.168.111.133 1521或tcping 192.168.111.133 1521 - Linux 服务器上用
nc -zv 192.168.111.133 1521(确保是外网 IP,不是127.0.0.1) - 如果仍不通,检查 CentOS 防火墙:
sudo firewall-cmd --list-ports,确认1521/tcp已放行
很多人卡在最后一步:以为监听配对了就万事大吉,结果发现 firewalld 默默拦住了 1521 端口。
Navicat 客户端 OCI 配置不是主因,但要排除干扰
ORA-12541 是服务端监听层问题,OCI 驱动版本错误通常引发的是 ORA-28547 或乱码。不过为防干扰,可快速核对:
- 下载与 Oracle 19c 大版本匹配的 Instant Client(如
instantclient-basic-windows.x64-19.30.zip) - 解压到纯英文路径(如
D:\instantclient_19_30) - Navicat → 工具 → 选项 → 环境 → OCI 库 → 指向
D:\instantclient_19_30\oci.dll - 重启 Navicat
如果 lsnrctl status 已显示正确 IP 且端口可达,OCI 配置错误不会导致 ORA-12541。











