根本原因是新主库未将服务名注册进监听器,导致客户端连接失败;须执行ALTER SYSTEM SET service_names及ALTER SYSTEM REGISTER,并确保TAF配置含完整FAILOVER_MODE(TYPE、METHOD、BACKUP),JDBC还需启用oracle.net.enableOob=true。
根本原因不是客户端没配taf,而是新主库压根没把服务名注册进监听器——lsnrctl status里根本查不到你要连的service_name,客户端连什么?连个空列表?
tnsnames.ora里加RETRY_COUNT和CONNECT_TIMEOUT没用
这两个参数只控制「发起一次连接请求」的行为:超时多久、重试几次。但问题不在客户端重试力度,而在于目标服务根本不存在于监听器中。你设RETRY_COUNT=100,它会连100次ORA-12516: TNS:listener could not find available handler,因为service_names没生效,监听器不认识这个服务名。
真正要做的,是在Switchover/Failover完成后,立刻在新主库上执行:
-
ALTER SYSTEM SET service_names='your_service_name' SCOPE=BOTH;(确保值含单引号,尤其有逗号或空格时) -
ALTER SYSTEM REGISTER;(触发PMON向监听器推送当前service_names,无需重启监听) - 再跑
lsnrctl status,确认Services Summary里已列出该服务
TAF配置必须写全FAILOVER_MODE三要素
只写FAILOVER=ON或只写BACKUP=xxx,TAF完全不生效。Oracle客户端只认嵌套在CONNECT_DATA或ADDRESS_LIST下的完整块:
-
TYPE:选SELECT(适合只读查询类业务)或SESSION(会话级重建,要求客户端支持) -
METHOD:必须是BASIC(故障后主动重试),别用PRECONNECT(预连开销大且易失败) -
BACKUP:必须指向另一个已定义的tnsnames别名,且那个别名自身也得带完整的FAILOVER_MODE
错误示例:(FAILOVER_MODE=(BACKUP=STBY)) —— 缺TYPE和METHOD,白配。
正确结构节选:
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=primary-host)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=standby-host)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=dg_taf_crmdb)
(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(BACKUP=STBY))
)
)
JDBC应用必须显式启用TAF回调
Thin驱动默认忽略TAF通知。即使tnsnames配对了,Java应用在主库宕机后仍会收到ORA-03113并中断,不会自动切走。
必须同时满足:
- tnsnames.ora中该连接别名启用完整
FAILOVER_MODE - JDBC URL里加
oracle.net.enableOob=true - 使用支持TAF的JDBC驱动(12c及以上推荐ojdbc8.jar,11g需ojdbc6_g.jar)
- 连接池(如HikariCP、Druid)要配置
connection-test-query=SELECT 1 FROM DUAL或启用validation-timeout,否则失效连接可能长期滞留
最容易被忽略的一步:Broker静态连接标识未更新
如果用了dgmgrl管理DG,切换后Broker内部仍缓存旧的StaticConnectIdentifier,下次执行switchover时可能去连已下线的实例,报ORA-12514。
必须手动刷新:
- 在
dgmgrl中执行:EDIT DATABASE 'old_primary_db' SET PROPERTY 'StaticConnectIdentifier' = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=new_host)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=new_db_unique_name)))'; -
old_primary_db是Broker中数据库的名称(不是db_unique_name),new_host和SERVICE_NAME要按新角色对齐
这步不干,TAF再稳,Broker自己先连错——整个高可用链条就断在管理面。


















