ora-12541错误主因是监听器绑定localhost或127.0.0.1,仅限本地访问;须修改listener.ora中host为服务器实际ip或0.0.0.0,执行lsnrctl reload,并验证status中address显示正确ip及防火墙放行1521端口。

lsnrctl status 显示 running 但远程连不上
这说明监听进程在跑,但只绑定了 localhost 或 127.0.0.1,根本没对外暴露。别被 “Listener is running” 蒙蔽。
执行 lsnrctl status 后,重点看 Listening Endpoints Summary 下的 Address 行:
(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521))
只要 HOST 是 localhost 或 127.0.0.1,就坐实了问题。此时本地 tnsping ORCLCDB 能通,Windows 客户端连 192.168.x.x:1521 必然失败。
- 改
$ORACLE_HOME/network/admin/listener.ora,把HOST = localhost换成服务器真实 IP(如192.168.111.133)或0.0.0.0(仅限内网) - 绝对不要留空、不要拼错(比如写成
locahost)、不要用未解析的主机名 - 改完必须执行
lsnrctl reload——restart不加载新配置,只是重启旧绑定
监听器进程根本没启动
很多人只信 lsnrctl status 输出,但它可能连的是默认监听器(LISTENER),而你的应用连的是自定义监听名或远程地址。最硬核的验证方式是查进程。
- Linux:运行
ps -ef | grep tnslsnr,确认有类似/u01/app/oracle/product/19c/dbhome_1/bin/tnslsnr的进程 - Windows:任务管理器 → 详细信息 → 搜索
tnslsnr.exe,注意“用户名”列是否为 Oracle 服务账户(如OracleServiceORCL对应的用户) - 如果
lsnrctl status报TNS-12560: TNS:protocol adapter error,基本可断定监听器压根没起来,此时先执行lsnrctl start
防火墙或网络策略拦住了 1521 端口
即使 lsnrctl status 显示正确 IP,客户端仍连不上,大概率卡在这一步。防火墙不放行,监听器再准也没用。
- 从客户端机器执行
telnet 192.168.111.133 1521(IP 和端口必须和连接字符串一致) - Windows 可用
tcping 192.168.111.133 1521,Linux 用nc -zv 192.168.111.133 1521 - CentOS 上检查:
sudo firewall-cmd --list-ports,确认1521/tcp已放行;没放行就加:sudo firewall-cmd --add-port=1521/tcp --permanent && sudo firewall-cmd --reload
C# 或 Navicat 连接时仍报 ORA-12541
这不是驱动或连接字符串的问题,而是服务端监听层没准备好。OCI 驱动版本不匹配通常引发的是 ORA-28547 或乱码,不是 ORA-12541。但为排除干扰,可快速核对:
- 下载与 Oracle 服务端大版本匹配的 Instant Client(如 Oracle 19c 就用
instantclient-basic-windows.x64-19.30.zip) - 解压到纯英文路径(如
D:\instantclient_19_30),并在 Navicat 或 C# 项目中指向该路径 - 确保连接字符串里的 host 和 port 与
lsnrctl status输出的 Address 完全一致
最容易被忽略的点是:改完 listener.ora 后忘了 lsnrctl reload,或者 reload 之后没验证 status 输出里的 HOST 是否真变了——很多人以为改了文件就生效了,其实监听器根本不读新内容。











