根本原因是监听器仅绑定回环地址,未监听真实网卡ip;需修改listener.ora中address的host为本机ip或可解析主机名,并执行lsnrctl reload生效。
oracle 安装后只能用 localhost 或 127.0.0.1 连接,换成本机 ip 就报 ora-12541: tns: no listener,根本原因不是数据库没启动,而是监听器(listener)只绑定了回环地址,没监听真实网卡 ip。
监听器只监听 localhost,IP 地址请求被直接丢弃
Oracle 默认安装时,listener.ora 中的 ADDRESS 段通常只含 (HOST=localhost) 或 (HOST=127.0.0.1)。这意味着监听器进程只接收发往本机回环接口的 TCP 连接,其他网卡(比如 192.168.x.x)上的请求根本进不来,自然无法响应。
验证方式:运行 lsnrctl status,看输出里 Listening Endpoints Summary... 下列出的地址是否只有 localhost:1521 或 127.0.0.1:1521。
- 不要只改
tnsnames.ora—— 那是客户端配置,服务端不认它 - 不要以为开了防火墙端口就万事大吉 —— 监听器根本没在那个 IP 上收包
- Windows 下服务名通常是
OracleOraDB21Home1TNSListener(Oracle 21c 示例),注意别重启错服务
正确修改 listener.ora:追加真实 IP 地址监听项
直接编辑 $ORACLE_HOME/network/admin/listener.ora,在 LISTENER 的 DESCRIPTION_LIST 内,复制一份已有 ADDRESS,仅把 HOST 改成本机实际 IP(如 192.168.1.100)或主机名(确保能被解析)。
示例片段(关键改动在第二行):
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
- 保留
localhost行,避免本地开发环境断裂 - 不要删掉
IPC行 —— 它用于本地进程间通信,删了可能影响某些管理命令 - 如果用主机名(如
MYPC),务必确认ping MYPC能通,且未被hosts文件错误映射到 127.0.0.1 - 改完必须执行
lsnrctl reload或先stop再start,reload更安全(不中断已有连接)
检查监听器是否真正生效:从协议和端口两个层面验证
改完配置不代表成功。常见失效场景包括:
- 监听器启动时报错:
TNS-01150: The address of the specified listener name is incorrect→ 检查HOST值是否拼写错误、是否为无效 IP(如 0.0.0.0 不被 Oracle 原生支持) -
lsnrctl status显示新地址,但telnet 192.168.1.100 1521不通 → Windows 防火墙拦截,需放行入站规则(端口 1521,TCP) - 远程机器能
telnet通,但连不上数据库 → 检查tnsnames.ora客户端配置中HOST是否填了服务端真实 IP,而非localhost - Oracle 21c+ 使用多租户时,确保 CDB 实例已注册到监听:运行
lsnrctl services,看输出里是否有你的SID或service_name
最易被忽略的一点:监听器绑定 IP 后,Oracle 实例本身仍需向该监听“注册自己”。如果实例启动早于监听,或监听重启后实例未自动重注册,lsnrctl services 会显示“Service has 1 instance(s).”但下面为空。此时手动执行 ALTER SYSTEM REGISTER;(在 SQL*Plus 中以 / as sysdba 登录后运行)可强制刷新注册。











