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 参数
| 参数 | 说明 |
|---|---|
| TYPE | SELECT/SESSION/NONE |
| METHOD | BASIC/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. 区别
| 项 | TAF | TAC |
|---|---|---|
| 位置 | 客户端 | 服务端 |
| 类型 | SELECT/SESSION | TRANSACTION |
| 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. 最佳实践
- 服务端 TAF/TAC:现代
- SCAN:RAC
- SELECT 类型:查询
- TRANSACTION:DML
- RETRIES/DELAY:合理
- FCF:应用
- 监控:及时
- 测试:故障
- 应用准备:重放
- 文档化:配置
16. 参考资料
[1] Oracle Database Development Guide 19c, “Application Continuity” https://docs.oracle.com/en/database/oracle/oracle-database/19/adfns/