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

ORA-12541 不是监听没启动,而是它“只听自己说话”——进程在跑、状态显示 READY,但绑定地址是 localhost 或 127.0.0.1,远程连接根本进不来。
看 lsnrctl status 输出里的真实 HOST 值
执行 lsnrctl status 后,别只扫一眼 “Listener is running”,重点盯住 Listening Endpoints Summary 下的 ADDRESS 行:
- ✅ 正确示例:
(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.111.133)(PORT=1521))(IP 是服务器真实外网地址) - ❌ 错误示例:
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))或(HOST=127.0.0.1) - 如果看到后者,问题根源已坐实:监听器没对外暴露,本地
tnsping ORCLCDB能通纯属走回环,Navicat 远程连192.168.x.x:1521必然失败
改 listener.ora 中的 HOST 并执行 lsnrctl 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——lsnrctl 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已放行;没放行就加:sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload
别被 OCI 驱动或 tnsnames.ora 干扰判断
ORA-12541 是服务端监听层问题,和客户端驱动无关:
-
OCI版本错配通常引发的是ORA-28547或乱码,不是ORA-12541 -
tnsnames.ora配置错误一般导致ORA-12154(TNS 无法解析),不是“无监听程序” - Navicat 连接时选
Basic模式直接填 IP/端口/服务名即可,无需依赖本地tnsnames.ora
真正卡住人的地方,往往不是监听没启动,而是它“假装在岗”——进程活着、状态显示正常、但耳朵只对着自己听。改配置 + lsnrctl reload + 看 status 输出里的真实 HOST 值,这三步缺一不可。











