0

0

如何配置RAC应用的透明应用故障转移TAF_tnsnames.ora failover设置

P粉602998670

P粉602998670

发布时间:2026-03-10 22:02:03

|

142人浏览过

|

来源于php中文网

原创

TAF生效必须配齐FAILOVER_MODE(嵌套在ADDRESS_LIST或CONNECT_DATA下)、TYPE=SESSION、METHOD=BASIC;ADDRESS_LIST顺序决定故障转移路径;RETRIES与DELAY需合理设置(如RETRIES=30, DELAY=3);Java/OCI客户端须显式启用TAF支持。

tnsnames.ora 里 TAF 配置必须写对这三处参数

透明应用故障转移(taf)不是加个 failover=on 就能用的。实际连不上、切不走、卡住不重试,八成是这三个参数没配齐或值不合理:failover_modetypemethod。缺一个,taf 就算声明了也等于没开。

常见错误现象:应用连接 RAC 主库后,主库实例宕机,连接直接报 ORA-03113: end-of-file on communication channel,而不是自动切到备库继续执行——说明 TAF 根本没生效。

  • FAILOVER_MODE 必须显式嵌套在 ADDRESS_LISTCONNECT_DATA 下,不能只写在顶层
  • TYPE 推荐用 SESSION(会话级切换),别用 SELECT(仅对查询有效,且要求客户端支持游标保持)
  • METHODBASIC(连接时预连备用地址),别用 PRECONNECT(启动时就建两套连接,资源开销大且易因网络抖动失败)

ADDRESS_LIST 顺序决定 failover 路径和重试行为

RAC 的 TAF 故障转移路径,完全由 ADDRESS_LISTADDRESS 的排列顺序决定。不是“谁快连谁”,而是“从上往下试,第一个通的用,挂了才切下一个”。顺序错了,failover 就会绕远路甚至失败。

使用场景:比如两个节点分别在不同机房,你希望优先走同城节点,跨城节点只作兜底——那就必须把同城的 ADDRESS 放前面。

  • 每个 ADDRESS 必须带独立的 (HOST=...)(PORT=...)(PROTOCOL=TCP),不能共用
  • 不要把两个节点塞进同一个 ADDRESS;TAF 不识别逗号分隔的 host 列表
  • 如果用了 SCAN 地址,它只能出现在第一个 ADDRESS,否则 TAF 无法解析后续节点位置

示例片段(正确):

RACDB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.example.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = node2-vip.example.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = racdb)
      (FAILOVER_MODE =
        (TYPE = SESSION)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

RETRIES 和 DELAY 参数直接影响故障感知时间

TAF 不是秒切。从主库宕机到应用拿到新连接,中间要等 RETRIES × DELAY 秒。默认 RETRIES=0 表示只试一次,失败就报错;DELAY=0 会疯狂重连,打爆监听器。

OneAI
OneAI

将生成式AI技术打包为API,整合到企业产品和服务中

下载

性能影响:设太大(比如 RETRIES=300, DELAY=10)会导致故障后长达 50 分钟无响应;设太小(如 DELAY=1)又可能在实例重启过程中反复失败,拖慢恢复。

  • 生产建议值:RETRIES=30(约 2–5 分钟总等待)、DELAY=3(避免瞬时抖动误判)
  • RETRIES 是对整个 ADDRESS_LIST 的总尝试次数,不是每个地址单独计数
  • 如果底层网络有防火墙或负载均衡器,DELAY 建议 ≥2 秒,避开其连接清理周期

Java / OCI 客户端必须显式启用 TAF 才认 tnsnames.ora 设置

tnsnames.ora 配好了,但 Java 应用还是不切?大概率是 JDBC 没打开 TAF 开关。Oracle JDBC 驱动默认忽略 FAILOVER_MODE,必须靠连接属性强制激活。

常见错误现象:SQL*Plus 能切,但 Spring Boot 应用连不上就报错——驱动层根本没读取或应用 TAF 配置。

  • JDBC URL 加 ;oracle.net.enableOob=true;oracle.net.timeout=60000(OoB 是 TAF 心跳基础)
  • DataSource 初始化时设 setConnectionProperties("oracle.jdbc.tafEnabled=true")
  • OCI 客户端(如 Pro*C)需在编译时链接 -lclntsh,且运行时 TNS_ADMIN 环境变量必须指向含正确 tnsnames.ora 的目录

没做这一步,tnsnames.ora 写得再准,TAF 对应用来说就是不存在。

最常被忽略的是客户端兼容性:12c 以后的 JDBC 驱动对 SELECT type 的 TAF 支持变弱,Session 级仍是唯一稳定选择。别在升级驱动后还沿用老文档里的 TYPE=SELECT 示例。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2132

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1663

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号