Oracle RAC 服务切换详解

Oracle RAC 服务切换详解

适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

RAC 服务切换保证应用连续[1]:

详细见:Oracle 服务管理详解Oracle 应用连续性详解


2. 服务概念

2.1 Preferred

- 首选实例
- 正常运行
- 优先

2.2 Available

- 备选实例
- Preferred 故障时
- 切换

2.3 切换

- 自动
- 透明
- 快速

3. 自动切换

3.1 节点故障

- Preferred 故障
- 服务切到 Available
- 自动

3.2 实例故障

- 实例崩溃
- 服务切换
- 自动

3.3 时间

- 秒级
- 应用重连
- TAF/AC

4. 手动切换

4.1 relocate

srvctl relocate service -d prod -s oltp_svc \
  -oldinst prod1 -newinst prod2

4.2 stop/start

srvctl stop service -d prod -s oltp_svc -i prod1
srvctl start service -d prod -s oltp_svc -i prod2

4.3 验证

srvctl status service -d prod -s oltp_svc

5. TAF

5.1 配置

srvctl add service -d prod -s taf_svc \
  -preferred prod1,prod2 \
  -tafpolicy BASIC

5.2 TNS

# tnsnames.ora
prod = 
  (DESCRIPTION = 
    (FAILOVER = ON)
    (ADDRESS = ...)
    (CONNECT_DATA = 
      (SERVICE_NAME = prod)
      (FAILOVER_MODE = 
        (TYPE = SELECT)
        (METHOD = BASIC)
        (RETRIES = 5)
        (DELAY = 10)
      )
    )
  )

5.3 行为

- 连接断开
- TAF 恢复
- SELECT 继续

详细见:Oracle TAF 与 TAC 配置详解


6. AC/TAC

6.1 AC

srvctl add service -d prod -s ac_svc \
  -preferred prod1,prod2 \
  -commit_outcome TRUE \
  -retention 86400 \
  -replay_init_time 300 \
  -session_state DYNAMIC

6.2 TAC

srvctl add service -d prod -s tac_svc \
  -preferred prod1,prod2 \
  -commit_outcome TRUE \
  -retention 86400 \
  -replay_init_time 300 \
  -session_state DYNAMIC

6.3 行为

- 事务重试
- 透明
- 连续

详细见:Oracle 应用连续性详解


7. FCF

7.1 连接池

// Java UCP
PoolDataSource pds = PoolDataSourceFactory.getPoolDataSource();
pds.setFastConnectionFailoverEnabled(true);
pds.setONSConfiguration("nodes=node1:6200,node2:6200");

7.2 事件

- ONS 事件
- 快速感知
- 切换

7.3 优势

- 快速
- 透明
- 性能

8. 负载均衡

8.1 Client-side

# tnsnames.ora
LOAD_BALANCE = ON

8.2 Server-side

- Listener 分配
- 基于负载
- 智能

8.3 服务

- Preferred/Available
- 负载分布
- 优化

9. 监控

9.1 服务状态

srvctl status service -d prod
srvctl config service -d prod -s oltp_svc

9.2 连接

SELECT inst_id, service_name, count(*) 
FROM gv$session 
GROUP BY inst_id, service_name;

9.3 事件

SELECT * FROM v$system_event WHERE event LIKE '%failover%';

10. 故障切换流程

10.1 检测

- 集群检测
- 服务故障
- 告警

10.2 切换

- Preferred -> Available
- 服务启动
- 应用重连

10.3 验证

- 服务状态
- 应用连接
- 业务

10.4 恢复

- 旧节点修复
- 服务回切
- 验证

11. 应用场景

11.1 节点故障

- RAC 节点故障
- 服务切换
- 秒级

11.2 维护

- 计划维护
- 服务迁移
- 零停机

11.3 负载

- 负载均衡
- 资源利用
- 性能

12. 常见问题

12.1 切换失败

- 状态
- 配置
- 检查

12.2 应用不重连

- TAF/AC
- 连接池
- 配置

12.3 负载不均

- LOAD_BALANCE
- 服务
- 优化

13. 最佳实践

  1. 服务化:所有应用
  2. Preferred/Available:配置
  3. TAF/AC:连续
  4. FCF:连接池
  5. 监控:状态
  6. 测试:切换
  7. 文档:配置
  8. 演练:故障
  9. 自动化:切换
  10. 优化:负载

14. 参考资料

[1] Oracle Database Administrator’s Guide 19c, “Managing Services” https://docs.oracle.com/en/database/oracle/oracle-database/19/admin/