oracle监听器必须在listener.ora中用address显式指定每个业务网ip(如192.168.10.100),host仅为别名不参与绑定;local_listener须设为客户端可达的vip或业务ip,否则pmon注册失败;tnsnames.ora中host应直写vip ip而非主机名。

listener.ora里必须用ADDRESS显式写每个IP,不能只靠HOST
Oracle监听器启动时只绑定ADDRESS块中列出的具体IP+PORT组合,HOST字段只是别名,不参与实际网络绑定。如果HOST解析出多个IP(比如双网卡主机名、VIP和物理IP共存),监听器只会取DNS或/etc/hosts返回的第一个结果——极大概率绑到私网或回环地址,导致客户端连不上。
常见错误现象:lsnrctl status显示监听地址是127.0.0.1或内网IP;tnsping通但sqlplus报ORA-12541: TNS:no listener。
-
ADDRESS必须填已激活的业务网IP(如192.168.10.100),不能写主机名 - 每个IP配一个独立
DESCRIPTION块,不要用逗号分隔或复用同一DESCRIPTION - 若启用VIP(如高可用或RAC场景),VIP必须作为单独
ADDRESS加入,且确保该IP已在系统生效(ip addr show能查到) - 端口建议统一(如全用
1521),避免不同IP走不同端口,增加客户端配置负担
LOCAL_LISTENER必须设为客户端可达的IP,不是本地网卡IP
这个参数控制数据库实例向监听器“自报家门”的地址。设错会导致PMON注册失败,lsnrctl services里看不到服务,客户端查不到实例,负载均衡器也收不到节点信息。
关键点:它的值必须是客户端能直接访问的地址,通常是VIP或业务网IP,绝不能是localhost、127.0.0.1或私网IP。
- 示例正确值:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.100)(PORT=1521)))(VIP) - 修改后执行:
ALTER SYSTEM SET LOCAL_LISTENER='...' SCOPE=BOTH;,再手动触发注册:ALTER SYSTEM REGISTER; - 验证是否注册成功:
lsnrctl services LISTENER中能看到对应INSTANCE_NAME条目 - 单机双网卡高可用场景下,
REMOTE_LISTENER可留空;RAC中需指向SCAN监听器
客户端tnsnames.ora里的HOST要直接写VIP IP,别写主机名
问题常不在VIP没生效,而在客户端解析绕过了VIP。典型原因是tnsnames.ora里HOST写了主机名(如db01),而该主机名在客户端/etc/hosts或DNS里被解析成了物理IP(如192.168.20.10),而非VIP(192.168.10.100)。
- 最稳妥做法:在
tnsnames.ora中HOST字段直接写VIP的IP,不写主机名 - 如果必须用主机名,确保客户端
/etc/hosts中该主机名**只映射VIP**,且排在物理IP前面 - Windows客户端还要检查
sqlnet.ora或注册表是否启用了USE_SHARED_SOCKET=TRUE,这会干扰绑定行为
多端口监听不是多IP绑定,别混用
一个监听器监听多个端口(如1521和1526)是可行的,但它和多IP绑定是两回事。前者解决的是端口级分流,后者解决的是网卡级可达性。
如果你的目标是让客户端通过不同网卡IP连接同一实例,重点永远在ADDRESS列表里列全所有业务IP,而不是堆端口。
- 错误做法:在一个
DESCRIPTION里写多个ADDRESS但只改PORT不改HOST,结果所有端口都绑到同一个IP上 - 正确结构:每个业务IP + 统一端口,各占一个独立
DESCRIPTION块 - 监听器重启后,用
lsnrctl status确认每个IP+PORT组合都出现在“Listening on”列表里
ADDRESS里白纸黑字写的IP,其余全是干扰项。最容易被忽略的,就是以为改了HOST就等于绑定了对应IP,结果系统默默绑到了第一个DNS解析结果上,而那个结果往往不是你要的。











