Oracle TAF 与 TAC 配置

Oracle TAF 与 TAC 配置

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


1. 概述

TAF(Transparent Application Failover)与 TAC(Transaction Application Continuity)提供故障透明[1]:

TAF

  • 客户端
  • SELECT / SESSION

TAC

  • 服务端
  • 事务重放

详细见:Oracle 网络架构与加密


2. TAF 类型

2.1 SESSION

- 会话重连
- DML 不重放
- 简单

2.2 SELECT

- 会话 + SELECT 继续
- 游标恢复
- 中断查询重放

2.3 NONE

- 默认
- 无 TAF

3. TAF 方法

3.1 BASIC

- 失败时重连
- 不预连接
- 节省资源

3.2 PRECONNECT

- 预连接备库
- 失败立即切换
- 资源 2 倍

4. TAF 配置(客户端)

4.1 tnsnames.ora

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

4.2 参数

参数说明
TYPESELECT/SESSION/NONE
METHODBASIC/PRECONNECT
RETRIES重试次数
DELAY重试间隔(秒)
BACKUP备份服务

5. TAF 配置(服务端)

5.1 服务

BEGIN
  DBMS_SERVICE.MODIFY_SERVICE(
    service_name => 'oltp',
    failover_method => 'BASIC',
    failover_type => 'SELECT',
    failover_retries => 180,
    failover_delay => 5
  );
END;
/

5.2 RAC srvctl

srvctl add service -db orcl -service oltp \
  -preferred orcl1 -available orcl2 \
  -tafpolicy BASIC

srvctl modify service -db orcl -service oltp \
  -failovertype SELECT \
  -failovermethod BASIC \
  -failoverretry 180 \
  -failoverdelay 5

6. TAC(19c+)

6.1 概述

- 事务级重放
- 服务端
- 应用透明

6.2 启用

BEGIN
  DBMS_APP_CONT.START_CONTINUITY(
    service_name => 'oltp',
    failover_type => 'TRANSACTION',
    failover_restore => 'LEVEL1',
    failover_delay => 10,
    failover_retries => 30,
    retain_observed_result => TRUE
  );
END;
/

6.3 srvctl

srvctl modify service -db orcl -service oltp \
  -failovertype TRANSACTION \
  -failoverrestore LEVEL1 \
  -failoverretry 30 \
  -failoverdelay 10 \
  -notification true \
  -commit_outcome true \
  -retention 3600 \
  -rlbgoal SERVICE_TIME \
  -clbgoal SHORT

6.4 客户端

# tnsnames.ora
ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan)(PORT = 1521))
    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = oltp))
    (CONNECT_TIMEOUT = 10)(RETRY_COUNT = 3)
  )

# sqlnet.ora
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 60
SQLNET.RECV_TIMEOUT = 60
SQLNET.SEND_TIMEOUT = 60

7. 区别

TAFTAC
位置客户端服务端
类型SELECT/SESSIONTRANSACTION
DML 重放
透明部分完全
版本老版本19c+

8. 验证

8.1 TAF

-- 验证 TAF 状态
SELECT username, failover_type, failover_method, failed_over 
FROM v$session 
WHERE username = 'SCOTT';

-- 测试
-- 1. 长查询
-- 2. 杀会话
-- 3. 自动重连

8.2 TAC

-- 应用连续性视图
SELECT * FROM dba_app_cont;

-- 验证
SELECT * FROM v$session 
WHERE service_name = 'oltp' 
AND failover_type = 'TRANSACTION';

9. 应用连续性

9.1 Replay

-- TAC 自动重放事务
-- 客户端无感知

9.2 限制

- DDL 不重放
- 某些 PL/SQL 不重放
- 应用需准备

10. FCF(Fast Connection Failover)

10.1 ODP.NET

// 连接字符串
User Id=scott;Password=****** Source=orcl;
Pooling=true;Min Pool Size=10;Connection Lifetime=300;
Validate Connection=true;
HA Events=true;Load Balancing=true;

10.2 JDBC

// OCI 连接
String url = "jdbc:oracle:oci:@(DESCRIPTION=...)";
OracleDataSource ods = new OracleDataSource();
ods.setURL(url);
ods.setFastConnectionFailoverEnabled(true);
ods.setConnectionCachingEnabled(true);

11. 测试

11.1 模拟故障

# RAC 实例停止
srvctl stop instance -db orcl -n rac1

# 应用观察
# - TAF:SELECT 继续
# - TAC:DML 重放

11.2 客户端日志

# sqlnet.ora
DIAG_ADR_ENABLED = ON
LOG_DIRECTORY_CLIENT = /tmp
LOG_FILE_CLIENT = sqlnet.log
TRACE_LEVEL_CLIENT = SUPPORT

12. 应用准备

12.1 重放安全

-- 标记不可重放
EXEC DBMS_APP_CONT.SET_REPLAY_ATTRIBUTE(
  ...
);

-- 应用代码
-- 避免非确定操作

12.2 事务边界

- 明确事务
- 避免长事务
- 提交点

13. 监控

13.1 失败统计

SELECT name, value 
FROM v$sysstat 
WHERE name LIKE '%failover%';

13.2 服务

SELECT service_id, name, failover_method, failover_type 
FROM dba_services 
WHERE name = 'oltp';

14. 常见坑与排错

14.1 TAF 不生效

- tnsnames.ora FAILOVER_MODE
- 服务名
- 测试

14.2 SELECT 中断

- TYPE=SELECT
- 游标状态

14.3 TAC 重放失败

- 不支持操作
- 应用调整
- 日志

14.4 连接重置

- RETRIES/DELAY
- 网络稳定

15. 最佳实践

  1. 服务端 TAF/TAC:现代
  2. SCAN:RAC
  3. SELECT 类型:查询
  4. TRANSACTION:DML
  5. RETRIES/DELAY:合理
  6. FCF:应用
  7. 监控:及时
  8. 测试:故障
  9. 应用准备:重放
  10. 文档化:配置

16. 参考资料

[1] Oracle Database Development Guide 19c, “Application Continuity” https://docs.oracle.com/en/database/oracle/oracle-database/19/adfns/