TNS-12541 表示监听器进程未运行,常见原因包括未执行 lsnrctl start、listener.ora 语法错误或端口被占用;需检查 listener.log 错误日志、确认 Alias/Version 匹配及 Uptime 是否合理。
lsnrctl status 命令没反应或报 TNS-12541 是什么情况
监听器根本没起来,lsnrctl status 会直接报 tns-12541: tns:no listener。这不是配置错,是进程压根不存在。
常见原因有三个:
-
lsnrctl start没执行过,或者上次异常退出后没重启 - 监听器配置文件
$ORACLE_HOME/network/admin/listener.ora语法错误,导致启动失败(查$ORACLE_HOME/network/log/listener.log最靠前的 ERROR 行) - 端口被占用,比如 1521 被其他程序占了,
lsnrctl start看似成功,实则监听绑定失败,status就查不到有效服务
输出里 “STATUS of the LISTENER” 下面的 “Alias” 和 “Version” 说明什么
这里不是废话,是判断监听器是否“真正在跑指定实例”的关键锚点。
Alias 必须和 listener.ora 里定义的监听器名一致(默认是 LISTENER);Version 显示的是监听器二进制版本,必须和数据库版本兼容——比如 19c 数据库配 11g 的监听器,可能连动态注册都失败。
特别注意:Uptime 时间太短(比如刚过几秒),大概率是刚 start 完但还没完成初始化,此时服务列表可能是空的,等 10–20 秒再 status 才准。
“Services Summary” 里没有你的数据库服务名?
这说明数据库实例没注册进来,分两种情况:
- 静态注册:检查
listener.ora里SID_LIST_LISTENER是否包含该实例的SID_DESC,且GLOBAL_DBNAME和ORACLE_SID拼写完全一致(大小写敏感) - 动态注册:确认数据库参数
local_listener指向正确的监听地址(如(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))),且service_names匹配你 connect 时用的服务名;另外remote_listener不要误配,否则会抢注到别的监听器上
一个典型坑:数据库启在容器里,local_listener 写了 localhost,但监听器在宿主机,网络不通,注册就静默失败。
看到 “Handler(s):” 但状态是 “blocked” 或 “refused”
这不是监听器问题,是数据库实例拒绝连接。常见于:
- 实例没 open(处于 mounted 状态),
select status from v$instance;查一下 - 数据库设置了
SEC_PROTOCOL_ERROR_FURTHER_ACTION,之前有非法连接触发了临时封禁 - 监听器日志里出现
ERROR: Unable to accept a connection,配合看sqlnet.log,大概率是sqlnet.ora里的SQLNET.INBOUND_CONNECT_TIMEOUT设得太小,连接握手超时被丢弃
别只盯着 lsnrctl status 输出看“有没有服务”,真正卡住的地方往往在数据库侧或网络策略层,日志路径和权限比命令本身更值得花时间确认。

















