监听器配置多个ADDRESS后不生效,是因为客户端未在tnsnames.ora中使用ADDRESS_LIST配合FAILOVER=on;监听器仅被动监听,故障转移必须由客户端连接描述符驱动,且HOST须填VIP而非物理IP。
监听器配置多个ADDRESS后不生效?检查tnsnames.ora是否指向了正确的HOST
oracle 12c监听器本身不提供“高可用”能力,它只是被动接收连接请求;真正在客户端侧实现故障转移的是tnsnames.ora里的连接描述符。只在listener.ora中给listener加多个address(比如两个ip或一个ip+一个vip),监听器会同时在这些地址上监听,但客户端若仍用单个host=连接,根本不会触发切换。
- 监听器的多
ADDRESS本质是“多端口/多IP共存”,不是自动故障转移——它连不上VIP时,也不会悄悄转到另一个IP - 真正起作用的是客户端
tnsnames.ora中使用(ADDRESS_LIST = ...)并启用FAILOVER=on - 常见错误:改完
listener.ora没执行lsnrctl reload,或reload后没验证lsnrctl status是否列出了所有地址
tnsnames.ora里怎么写ADDRESS_LIST才能触发VIP故障转移
必须显式使用ADDRESS_LIST包裹多个ADDRESS,且设置FAILOVER=on和LOAD_BALANCE=off(否则可能轮询而非故障转移)。
MYDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = mydb)
(FAILOVER_MODE = (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 3)(DELAY = 5))
)
(FAILOVER=on)
)
-
FAILOVER=on必须放在最外层DESCRIPTION下,不是CONNECT_DATA里 - 两个
ADDRESS的HOST应为集群VIP(如node1-vip),不能填物理IP,否则RAC节点宕机后VIP漂移失效 - 如果用SCAN地址,就不用手动列多个VIP——SCAN本身就是高可用入口,此时
tnsnames.ora只需一个ADDRESS
监听器监听多个IP时,为什么lsnrctl status只显示一个地址
这是典型配置遗漏:listener.ora里必须为每个ADDRESS指定唯一PROTOCOL和HOST,且不能混用通配符(如HOST = *)和具体IP。Oracle 12c默认只显示第一个有效监听地址,除非所有ADDRESS都通过lsnrctl status明确绑定成功。
- 错误写法:
(ADDRESS = (PROTOCOL = TCP)(HOST = *)(PORT = 1521))—— 通配符可能导致部分地址未被识别 - 正确写法:
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.101)(PORT = 1521))和(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.102)(PORT = 1521)) - 执行
lsnrctl status后,看输出里Listening Endpoints Summary...是否列出全部地址;若只列一个,说明第二个地址绑定失败(常因端口被占、防火墙拦截或HOST不可达)
监听器多地址+客户端ADDRESS_LIST组合下,连接超时时间由谁控制
由两层叠加决定:客户端SQL*Net层面的TIMEOUT参数(如TCP.CONNECT_TIMEOUT)控制单次连接尝试时长,而FAILOVER_MODE.RETRIES和.DELAY控制整体重试周期。监听器自身没有“连接超时”配置项。
- 默认
TCP.CONNECT_TIMEOUT=60秒(Linux/Unix),意味着每次连一个ADDRESS最多等60秒才失败 - 若
RETRIES=3且DELAY=5,最坏情况要等60 + 5 + 60 + 5 + 60 = 190秒才报错——这远超业务容忍范围 - 建议在
sqlnet.ora中显式设置:TCP.CONNECT_TIMEOUT=10和SQLNET.RECV_TIMEOUT=10,再配合RETRIES=2、DELAY=2
真正难调的是网络层不可达与数据库实例未响应的区分:监听器起来了但实例挂了,客户端仍会连上监听器再等CONNECT_DATA超时(默认约60秒),这个时间无法通过监听器配置缩短。


















