ORA-12541报错本质是客户端无法连接监听器,70%原因为监听器未启动;应先检查lsnrctl status或进程是否存在,再排查端口、服务名、实例状态及网络连通性。
ORA-12541 报错时,先确认监听器进程是否真的在运行
这个错误本质是客户端连不到监听器,但很多人一看到报错就去改 tnsnames.ora 或重配服务名,其实 70% 的情况是监听器根本没起来。别急着查配置,先看进程。
- Linux/Unix 下直接执行
ps -ef | grep lsnr,有类似/u01/app/oracle/product/19c/dbhome_1/bin/tnslsnr的进程才算正常运行 - Windows 下打开任务管理器,搜索
tnslsnr.exe;或者用管理员权限运行lsnrctl status—— 如果提示“TNS-12560: TNS:protocol adapter error”,大概率是监听器根本没启动,不是配置问题 - 注意:
lsnrctl status命令本身依赖本地 ORACLE_HOME 和 ORACLE_SID 环境变量,如果没设对,它会报错或返回空结果,不代表监听器挂了
lsnrctl status 返回 TNS-01106 或找不到监听器名
这说明 lsnrctl 找不到监听器配置,常见于监听器没用默认名 LISTENER,或者 listener.ora 路径/内容不匹配。
- 检查
$ORACLE_HOME/network/admin/listener.ora是否存在,且里面至少有一段形如LISTENER = (DESCRIPTION = ...)的定义(名字不一定要叫 LISTENER,但lsnrctl status默认查它) - 如果监听器用了自定义名(比如
MYLISTENER),必须显式调用lsnrctl status MYLISTENER,否则查不到 -
listener.ora中的HOST值不能写成localhost或127.0.0.1(除非客户端也走回环),生产环境建议填实际网卡 IP 或主机名,并确保/etc/hosts解析正确
lsnrctl status 显示监听器运行中,但还是连不上
这时候问题不在监听器“启没启”,而在它“听没听对端口”或“认不认识你的服务名”。重点看输出里的 Listening Endpoints Summary... 和 Services Summary... 两块。
- 确认
Listening Endpoints里列出的端口(通常是 1521)和你连接串里写的端口一致;如果显示的是1522却还连1521,肯定报 ORA-12541 - 检查
Services Summary是否包含你的数据库实例名(比如orcl)或全局数据库名(比如orcl.example.com)。如果这里为空或只有UNKNOWN,说明监听器没收到实例的动态注册,需要确认数据库的local_listener参数是否设对,或手动静态注册 - 防火墙可能拦了监听端口:Linux 上用
ss -tlnp | grep :1521看端口是否真正 bind 到 0.0.0.0 或具体 IP;Windows 上检查 Windows Defender 防火墙入站规则
Oracle 19c+ 使用多租户时,CDB/PDB 服务名容易混淆
ORA-12541 在 CDB 环境下常因连错服务名而误判。监听器看到的是服务名(SERVICE_NAME),不是 SID,且 PDB 的服务名默认不是 PDB$SEED 或 ORCLPDB1 这种名字就能直接连。
- 查当前已注册的服务名:登录数据库后运行
SELECT name, pdb FROM v$services ORDER BY name;,结果里的name列才是监听器对外暴露的服务名 - CDB 根容器的服务名通常是
ORCL(或你装库时指定的全局名),而 PDB 的服务名默认是PDB_NAME,但前提是 PDB 已 open 且监听器收到了它的注册请求 - 如果 PDB 是
MOUNTED状态,它不会向监听器注册服务名,此时连该服务名也会触发 ORA-12541 —— 不是监听器问题,是 PDB 没起来
telnet host_ip 1521 或 nc -zv host_ip 1521 实测端口可达性。










