ora-12541根本原因是监听器绑定localhost或127.0.0.1导致远程不可达,须修改listener.ora中host为实际ip或0.0.0.0,执行lsnrctl reload,并验证status中address显示正确ip及端口可达、防火墙放行1521。

ORA-12541 不是监听没启动,而是它“只听自己说话”——进程在跑、状态显示 READY,但 HOST 绑定的是 localhost 或 127.0.0.1,远程请求根本进不来。改配置 + lsnrctl reload + 验证真实绑定地址,这三步缺一不可。
检查 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/C# 客户端从 Windows 连
192.168.x.x:1521必然失败 -
lsnrctl restart无效——它不加载新配置,只是重启旧绑定
修改 listener.ora 中的 HOST 值并 reload
路径在 $ORACLE_HOME/network/admin/listener.ora,找到类似段落:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
)
把 HOST = localhost 改成:
-
HOST = 192.168.111.133(服务器实际网卡 IP,推荐) - 或
HOST = 0.0.0.0(监听所有接口,仅限可信内网)
绝对不要留空、不要写错别字(如 locahost)、不要用未解析的主机名。改完必须执行 lsnrctl reload(不是 stop/start),让监听器热加载配置。
验证端口可达性与防火墙放行
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 端口。
确认监听进程是否真正在运行(别信 status 表面输出)
lsnrctl status 可能只是连上了默认监听器(LISTENER),而你的客户端连的是远程服务器或自定义监听名。更可靠的方式是直接查进程:
- Linux:运行
ps -ef | grep tnslsnr,确认有类似/u01/app/oracle/product/19c/dbhome_1/bin/tnslsnr的进程在跑 - Windows:任务管理器 → 详细信息页 → 搜索
tnslsnr.exe,注意看“用户名”列是否为运行 Oracle 的服务账户
如果 lsnrctl status 报 TNS-12560: TNS:protocol adapter error,基本可以断定监听器根本没启动,此时 lsnrctl start 才是第一步。
真正卡住人的地方,往往不是监听没启动,而是它“假装在岗”——进程活着、状态显示正常、但耳朵只对着自己听。改配置 + reload + 看 status 输出里的真实 HOST 值,这三步缺一不可。漏掉任何一步,错误都会原样复现。











