导读:本期聚焦于郭世昌创作的《如何配置Oracle RAC集群客户端tnsnames.ora实现故障转移与负载均衡》,敬请观看详情。为什么在Oracle RAC集群中客户端使用普通单实例连接串会导致节点故障时业务中断?原因是tnsnames.ora中只配置了一个节点地址,无法在RAC节点间切换。正确做法是为连接描述配置地址列表或SCAN名称,并启用LOAD_BALANCE与FAILOVER,使客户端在建立连接时既能分散到不同节点,也能在故障时自动尝试其他地址。本文围绕tnsnames.ora的结构展开,对比SCAN监听与VIP监听两种配置方式,给出可直接使用的配置示例,解释FAILOVER_MODE各参数的作用,并介绍通过tnsping和SQL查询验证连接分发效果的方法。掌握这些配置后,应用侧无需修改代码即可获得RAC高可用能力。

Oracle RAC集群对外提供数据库服务时,客户端通常不需要安装集群软件,只需在应用服务器上配置Oracle客户端并编写正确的tnsnames.ora文件。很多RAC连接问题并非数据库本身故障,而是tnsnames.ora中地址配置不完整或参数缺失,导致客户端无法在节点间切换。本文将详细说明RAC环境下的tnsnames.ora配置方法。

一、RAC客户端连接方式:SCAN与VIP的区别

在配置tnsnames.ora之前,需要先理解RAC集群向外提供服务的两种监听方式。RAC每个节点都有自己的VIP地址和本地监听,节点间故障时VIP会漂移到其他节点,保证物理IP层面仍然可用。如果客户端使用某个节点的VIP连接,当该节点发生故障时,客户端需要依赖连接串中的其他VIP地址进行重连。

从Oracle 11g Release 2开始引入SCAN,它是一种集群级别的虚拟主机名,通常对应DNS中的三个IP地址。SCAN监听由集群统一管理,客户端只需要配置一个SCAN名称,就能自动连接到集群中某一个可用节点的监听。SCAN方式简化了客户端配置,也避免在节点增加或减少时频繁修改tnsnames.ora。

不过,VIP方式在部分旧版本或特定网络环境下仍然存在。两者的选择取决于客户端版本、网络DNS配置以及运维习惯。一般来说,新建系统建议优先使用SCAN名称,只有无法解析SCAN时才退回到多VIP地址列表。

二、tnsnames.ora核心配置与参数说明

tnsnames.ora文件位于客户端Oracle Home的network/admin目录下,例如Linux环境中的$ORACLE_HOME/network/admin/tnsnames.ora,Windows环境中的C:\app\oracle\product\19.0.0\dbhome_1\network\admin\tnsnames.ora。文件中的每个网络服务名由一组括号表达式定义,客户端连接时通过服务名查找对应的连接描述。

一个完整的RAC连接描述通常包含DESCRIPTION、ADDRESS_LIST或ADDRESS、CONNECT_DATA三部分。其中ADDRESS指定监听协议、主机名和端口,CONNECT_DATA指定服务名和服务器模式。对于RAC多节点场景,需要在ADDRESS_LIST中放入多个ADDRESS条目,并通过LOAD_BALANCE和FAILOVER参数控制地址选择行为。

LOAD_BALANCE参数有两个取值:ON表示客户端在地址列表中选择一个地址,OFF表示逐个尝试直到成功。FAILOVER参数控制当前地址连接失败后是否继续尝试下一个地址。在RAC环境中,通常将LOAD_BALANCE设为ON,让连接随机分布到不同节点;将FAILOVER设为ON,保证某个节点监听不可用时自动切换到其他节点。

如果希望实现更细粒度的故障转移,例如连接建立后发生实例故障时自动重新连接,可以在CONNECT_DATA中增加FAILOVER_MODE子句。它通过TYPE指定故障转移类型,常见取值为SELECT、SESSION、NONE。METHOD可以设置为BASIC,表示客户端在连接失败后重新建立连接。RETRIES和DELAY分别控制重试次数和重试间隔。

三、完整配置示例与场景选择

以下是使用SCAN名称的典型配置,适合已经配置了SCAN监听的RAC集群。该配置通过一个SCAN名称即可访问整个集群,客户端无需知道具体节点地址。

ORCL_RAC =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.ippipp.com)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

如果客户端无法解析SCAN名称,或者需要显式指定各个节点的VIP地址,可以使用下面的多地址配置。这里同时启用了LOAD_BALANCE和FAILOVER,并在CONNECT_DATA中加入了FAILOVER_MODE,使连接建立后也能在实例故障时进行切换。

ORCL_RAC_VIP =
  (DESCRIPTION =
    (LOAD_BALANCE = ON)
    (FAILOVER = ON)
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip.ippipp.com)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip.ippipp.com)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
      (FAILOVER_MODE =
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 180)
        (DELAY = 5)
      )
    )
  )

在实际选择时需要注意,如果同时配置了SCAN和VIP地址,客户端会遵循DESCRIPTION中的地址列表顺序。对于仅需要负载均衡而不要求透明应用故障转移的场景,可以省略FAILOVER_MODE,仅保留LOAD_BALANCE和FAILOVER参数。对于要求应用无感知切换的关键系统,则建议保留FAILOVER_MODE,并将TYPE设置为SELECT或SESSION。

四、配置验证与常见问题排查

配置文件编写完成后,可以先使用tnsping命令检查服务名是否可以解析。命令格式为tnsping ORCL_RAC。如果返回OK并显示连接耗时,说明网络服务名配置正确,客户端能够找到监听地址。如果提示TNS-03505或TNS-12541,则需要检查主机名解析、监听端口和服务名是否匹配。

进一步验证时,可以使用sqlplus以指定服务名连接数据库,例如sqlplus username/password@ORCL_RAC。连接成功后,在数据库中执行SELECT INSTANCE_NAME, HOST_NAME FROM GV$INSTANCE;查看当前连接的实例名和主机名。多次连接并观察INSTANCE_NAME的变化,可以验证LOAD_BALANCE是否生效。如果所有连接都落在同一个节点,说明LOAD_BALANCE未生效或地址列表中只有一个可用地址。

常见问题包括:只配置了一个节点的VIP地址,导致该节点故障时客户端无法连接;SERVICE_NAME写成了实例名而非服务名,导致连接报ORA-12514;FAILOVER_MODE中RETRIES设置过小,导致实例切换期间客户端提前放弃;以及DNS解析不到SCAN名称,导致连接超时。排查时应结合监听日志和客户端sqlnet.ora中的跟踪配置,逐步定位是地址解析、监听注册还是服务名解析的问题。

Oracle RACtnsnames.ora客户端负载均衡修改时间:2026-08-30 20:35:33

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。