如何调整Oracle 19c监听器以实现多IP地址绑定,更新listener.ora中的地址配置?
- 内容介绍
- 文章标签
- 相关推荐
本文共计963个文字,预计阅读时间需要4分钟。
相关专题:
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配一个独立
ADDRESS,不要用逗号分隔或试图复用同一个DESCRIPTION - 若启用VIP(如RAC或高可用场景),VIP必须作为独立
ADDRESS加入,且确保该IP已在系统中生效(ip addr show能查到) - 端口建议统一(如全用
1521),避免不同IP走不同端口,增加客户端配置复杂度
LOCAL_LISTENER和REMOTE_LISTENER必须设为客户端可达的地址
这两个参数控制数据库实例向监听器“自报家门”的地址。设错会导致PMON注册失败,lsnrctl services里看不到服务,客户端查不到实例,负载均衡器收不到节点信息。
关键点:它们的值必须是客户端能直接访问的IP(通常是VIP或业务网IP),不是本地网卡IP,更不能是localhost或127.0.0.1。
-
LOCAL_LISTENER应指向本机监听的VIP或业务网IP+端口,例如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.100)(PORT=1521))) -
REMOTE_LISTENER在RAC中指向SCAN监听器;单机双网卡高可用场景可留空,或指向同集群其他节点的VIP - 修改后执行:
ALTER SYSTEM SET LOCAL_LISTENER='...' SCOPE=BOTH;,再手动触发注册:ALTER SYSTEM REGISTER; - 验证是否注册成功:
lsnrctl services LISTENER里能看到service_name下有对应INSTANCE_NAME条目
tnsnames.ora里HOST写VIP IP,别写主机名
客户端连的是物理IP而不是VIP,通常不是VIP没生效,而是tnsnames.ora里HOST写了主机名,而该主机名在客户端/etc/hosts或DNS里被解析成了物理IP(如db01 → 192.168.20.10),而非VIP(192.168.10.100)。
- 最稳妥做法:在
tnsnames.ora中直接写VIP的IP,不写主机名 - 如果必须用主机名,确保客户端
/etc/hosts里该主机名**只映射VIP**,且排在物理IP前面 - 检查客户端是否启用了
USE_SHARED_SOCKET=TRUE(Windows注册表或sqlnet.ora),这会干扰绑定行为
重启监听前先确认IP已就绪,别跳过验证步骤
改完listener.ora后直接lsnrctl reload或stop/start容易失败,因为监听器启动时会校验每个ADDRESS里的IP是否真实存在并可绑定。如果VIP还没漂过来、或虚拟网卡没up,监听会静默跳过该地址,甚至整个启动失败。
- 先运行
ip addr show确认所有目标IP(含VIP)已出现在对应网卡上 - 用
ping -I ens33 192.168.10.100测试指定网卡能否通VIP(避免路由干扰) - 改完
listener.ora后,先lsnrctl reload LISTENER,再lsnrctl status LISTENER核对输出中的Listening Endpoints Summary...是否列出了全部预期IP - 特别注意:RAC环境下,VIP漂移由CRS托管,监听资源也必须由CRS管理,不能手工
lsnrctl start,否则生命周期不一致
本文共计963个文字,预计阅读时间需要4分钟。
相关专题:
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配一个独立
ADDRESS,不要用逗号分隔或试图复用同一个DESCRIPTION - 若启用VIP(如RAC或高可用场景),VIP必须作为独立
ADDRESS加入,且确保该IP已在系统中生效(ip addr show能查到) - 端口建议统一(如全用
1521),避免不同IP走不同端口,增加客户端配置复杂度
LOCAL_LISTENER和REMOTE_LISTENER必须设为客户端可达的地址
这两个参数控制数据库实例向监听器“自报家门”的地址。设错会导致PMON注册失败,lsnrctl services里看不到服务,客户端查不到实例,负载均衡器收不到节点信息。
关键点:它们的值必须是客户端能直接访问的IP(通常是VIP或业务网IP),不是本地网卡IP,更不能是localhost或127.0.0.1。
-
LOCAL_LISTENER应指向本机监听的VIP或业务网IP+端口,例如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.100)(PORT=1521))) -
REMOTE_LISTENER在RAC中指向SCAN监听器;单机双网卡高可用场景可留空,或指向同集群其他节点的VIP - 修改后执行:
ALTER SYSTEM SET LOCAL_LISTENER='...' SCOPE=BOTH;,再手动触发注册:ALTER SYSTEM REGISTER; - 验证是否注册成功:
lsnrctl services LISTENER里能看到service_name下有对应INSTANCE_NAME条目
tnsnames.ora里HOST写VIP IP,别写主机名
客户端连的是物理IP而不是VIP,通常不是VIP没生效,而是tnsnames.ora里HOST写了主机名,而该主机名在客户端/etc/hosts或DNS里被解析成了物理IP(如db01 → 192.168.20.10),而非VIP(192.168.10.100)。
- 最稳妥做法:在
tnsnames.ora中直接写VIP的IP,不写主机名 - 如果必须用主机名,确保客户端
/etc/hosts里该主机名**只映射VIP**,且排在物理IP前面 - 检查客户端是否启用了
USE_SHARED_SOCKET=TRUE(Windows注册表或sqlnet.ora),这会干扰绑定行为
重启监听前先确认IP已就绪,别跳过验证步骤
改完listener.ora后直接lsnrctl reload或stop/start容易失败,因为监听器启动时会校验每个ADDRESS里的IP是否真实存在并可绑定。如果VIP还没漂过来、或虚拟网卡没up,监听会静默跳过该地址,甚至整个启动失败。
- 先运行
ip addr show确认所有目标IP(含VIP)已出现在对应网卡上 - 用
ping -I ens33 192.168.10.100测试指定网卡能否通VIP(避免路由干扰) - 改完
listener.ora后,先lsnrctl reload LISTENER,再lsnrctl status LISTENER核对输出中的Listening Endpoints Summary...是否列出了全部预期IP - 特别注意:RAC环境下,VIP漂移由CRS托管,监听资源也必须由CRS管理,不能手工
lsnrctl start,否则生命周期不一致

