Oracle RAC/ADG无法靠固定IP实现透明切换,因其本质是角色互换而非IP保留;必须通过SCAN IP(DNS解耦)或服务名+故障转移策略,使客户端始终访问逻辑地址而非物理IP。
SCAN IP 和 VIP 本身就是为了实现“客户端无感切换”而设计的,不是靠“保证IP不变”,而是靠**DNS/负载均衡层解耦真实节点IP与服务入口**。直接硬改客户端连接串里的IP地址,等于放弃Oracle高可用架构的设计初衷。
为什么不能靠“固定IP”来实现透明切换
oracle rac 或 adg 的容灾切换(尤其是 switchover)本质是角色互换:原主库变备库,原备库变主库。如果客户端直连某台物理机的 public ip,切换后这台机器已不再提供主库服务,连接必然失败。所谓“ip不变”,实际是指客户端始终通过同一个逻辑地址访问服务——这个地址必须与具体节点解耦。
SCAN IP 是最标准的解耦方案
SCAN IP(Single Client Access Name)是 Oracle RAC/ADG 场景下官方推荐的客户端接入点,它背后由 DNS 轮询指向多个 VIP,而 VIP 又绑定在当前主库节点上。当发生 Switchover 后,集群自动将 SCAN IP 对应的 VIP 迁移到新主库节点,DNS 缓存刷新后客户端即可继续访问。
- DNS 必须配置至少 3 个
SCAN IP(19c 要求),且全部解析到同一 SCAN 名称,例如ora19c-scan.example.com - 所有节点的
/etc/hosts中禁止写死 SCAN 解析——必须走真实 DNS,否则 VIP 迁移后无法生效 - 客户端
tnsnames.ora中使用SCAN名称,而非 IP:ORA19C =<br> (DESCRIPTION =<br> (ADDRESS = (PROTOCOL = TCP)(HOST = ora19c-scan.example.com)(PORT = 1521))<br> (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = ora19c)))
VIP 需要配合 CRS 资源管理,不能手动绑死
VIP(Virtual IP)由 Oracle Clusterware 自动管理,绑定在当前主库所在节点的网卡上。它的作用是快速故障转移(如节点宕机时秒级漂移),但不适用于 ADG Switchover 场景下的跨集群切换——因为 ADG 备库通常不在同一集群内。
- 在 RAC 环境中,
VIP配置必须通过srvctl modify vip更新,不能仅改操作系统 IP - ADG 环境若想复用 VIP 概念,需把备库也纳入同一集群(极少见,且违背 ADG 物理隔离原则)
- 误在备库操作系统层面
ifconfig绑定 VIP,会导致 CRS 冲突、资源 offline、甚至 OCR 损坏
ADG 切换后客户端如何“无感”?关键在 SERVICE_NAME 和 TNS 切换策略
ADG 本身不提供 SCAN,但可通过数据库服务(service_name)+ 客户端重试机制实现逻辑透明:
- 主库和备库配置相同的
service_name(如oltp_svc),并在 Switchover 前启用FAILOVER_TYPE=SESSION和RETRY_COUNT=3等参数 - 客户端连接串中不要写死 HOST,改用两个地址做 ADDRESS_LIST,并开启
LOAD_BALANCE=off和FAILOVER=on - 更稳妥的做法是配合外部负载均衡器(如 F5、HAProxy),监听端口转发到当前主库的
Public IP,并将健康检查指向SELECT STATUS FROM V$INSTANCE











