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