根本原因是host解析失败,TNS-12545与TNS-00515明确指向hostname lookup failed;需确保/etc/hosts中当前hostname对应正确IP,且listener.ora中HOST值与hostname命令输出严格一致,三处字符串必须完全匹配。
监听器启动后立刻退出,根本原因是 host 解析失败
不是网络不通、不是端口被占、也不是 oracle 进程权限问题——tns-12545 和紧随其后的 tns-00515(hostname lookup failed)明确指向解析环节。oracle 启动监听时,会把 listener.ora 里 address 段中的 host 值交给操作系统做 dns 或 /etc/hosts 查找;查不到有效 ipv4/ipv6 地址,就直接 abort,不继续绑定端口。
检查 /etc/hosts 是否包含当前 hostname 对应的正确 IP
这是最常被忽略的一环。即使 hostname 命令返回 db01,如果 /etc/hosts 里没写 192.168.10.5 db01,监听器照样失败。
- 运行
hostname,记下输出值(比如db01) - 运行
ip addr show或ifconfig,确认主网卡实际 IP(比如192.168.10.5) - 编辑
/etc/hosts,确保该 IP 后紧跟 hostname 和 FQDN(如192.168.10.5 db01 db01.localdomain) - 不要只留
127.0.0.1 db01—— 这会让监听绑定到 loopback,客户端远程连不上
listener.ora 中 HOST 必须与系统 hostname 严格一致
listener.ora 的 HOST 值不是“随便填个能 ping 通的地址”,它必须和 hostname 命令输出完全匹配(大小写、点号、空格都不能差)。
- 错误示例:
HOST = DB01(大写),但hostname返回db01 - 错误示例:
HOST = db01.localdomain,但/etc/hosts只写了db01 - 稳妥做法:直接用
hostname输出值替换listener.ora中所有HOST=xxx - 临时验证可改用 IP:
HOST = 192.168.10.5,绕过主机名解析,但生产环境不推荐长期使用
Windows 上特别注意 host.docker.internal 和 localhost 的陷阱
在 Docker Desktop 或 WSL2 环境中装 Oracle,listener.ora 里若残留 HOST=host.docker.internal,Windows 主机根本无法解析这个名称,必报 TNS-12545。
- 查当前 Windows 主机名:
hostname(命令行) - 查本机 IPv4 地址:
ipconfig | findstr IPv4 - 把
listener.ora中的HOST改成该 IP,或改成 Windows 主机名(需同步更新C:\Windows\System32\drivers\etc\hosts) -
localhost在 Windows 上通常能解析,但仅限本地连接;远程客户端仍需真实 IP 或可解析的 hostname
hostname、/etc/hosts、listener.ora 这三处字符串一个字母不一致,或者 IP 写成了旧地址——重启监听前,务必用 nslookup $(hostname) 或 ping $(hostname) 实测能否解析出预期 IP。











