application continuity在oracle 19c rac中启用需满足:数据库为ee+rac/adg、compatible≥12.2.0、服务通过srvctl配置且failover_type=transaction、replay_initiation_timeout>0、replay_enabled=yes,客户端odp.net unmanaged driver≥12.2并显式设置application continuity=true。
确认数据库和客户端版本是否满足最低要求
application continuity 在 oracle 19c rac 中可用,但前提是数据库必须启用 transaction guard(事务卫士),且服务必须基于支持 ac 的 oracle real application clusters 配置。关键检查点包括:
- 数据库版本 ≥ 12.2(19c 满足),且为 Enterprise Edition + RAC 或 Active Data Guard 许可
- 服务必须通过
srvctl创建或修改,不能用DBMS_SERVICE手动注册(后者不支持 AC 相关属性) - 客户端驱动必须是 ODP.NET Unmanaged Driver ≥ 12.2;
ODP.NET Managed Driver和ODP.NET Core明确不支持 AC - 数据库初始化参数
compatible必须 ≥'12.2.0',否则服务创建时会忽略REPLAY_INITIATION_TIMEOUT等关键属性
用 srvctl 修改服务并启用 Application Continuity
AC 不是数据库级开关,而是绑定在服务(Service)上的行为。必须通过 srvctl 命令配置服务参数,直接改 tnsnames.ora 或连接字符串无效。
- 先查当前服务状态:
srvctl config service -d <db_unique_name></db_unique_name> - 停用服务:
srvctl stop service -d <db_unique_name> -s <service_name></service_name></db_unique_name> - 修改服务并启用 AC:
srvctl modify service -d <db_unique_name> -s <service_name> -j SHORT -e SESSION -m BASIC -z 180 -w 5 -y AUTOMATIC -B SERVICE_TIME -r -f --replay_initiation_timeout 300 --failovertype TRANSACTION --failovermethod BASIC</service_name></db_unique_name> - 其中关键参数:
--replay_initiation_timeout 300表示故障后最多等待 5 分钟启动重放;--failovertype TRANSACTION是 AC 的必要前提(TAF 只支持SELECT);-j SHORT强制使用短连接模式,避免长事务干扰重放判断 - 重启服务:
srvctl start service -d <db_unique_name> -s <service_name></service_name></db_unique_name>
验证服务是否真正启用了 AC
仅靠 srvctl config service 输出看不出 AC 是否生效,必须查数据字典视图。常见误判是看到 FAILOVER_TYPE=TRANSACTION 就认为 AC 已就绪,其实还缺底层支撑。
- 登录数据库执行:
SELECT name, failover_type, failover_method, replay_initiation_timeout FROM dba_services WHERE name = '<service_name>';</service_name> - 正确结果必须同时满足:
failover_type = 'TRANSACTION'、failover_method = 'BASIC'、replay_initiation_timeout > 0 - 额外验证:
SELECT * FROM v$active_services WHERE name = '<service_name>' AND replay_enabled = 'YES';</service_name>—— 这个字段才是 AC 实际启用的最终标志 - 如果
replay_enabled = 'NO',即使其他参数都对,也说明数据库未开启 Transparent Application Continuity(TAC)基础能力,需检查compatible参数或 RAC 实例状态
客户端连接字符串必须显式声明 Application Continuity=true
服务端配置只是前提,客户端不配合,AC 完全不会触发。ODP.NET 连接字符串里漏掉这个开关,等于白配。
- 正确写法(Unmanaged Driver):
Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myac_service)(FAILOVER=ON)));User Id=scott;Password=tiger;Application Continuity=true; -
Application Continuity=true必须是独立键值对,不能合并进括号内;大小写敏感,True或TRUE都不认 - 不要和
Failover=true混用——后者只激活 TAF,与 AC 冲突;AC 自带故障转移逻辑,再开 Failover 反而可能破坏重放一致性 - 应用启动后,可通过
OracleConnection.DataSource属性检查运行时是否实际加载了 AC 支持;若该属性为空或抛异常,说明驱动未识别该服务的 AC 能力
最容易被忽略的是:AC 重放只对「可重放请求」生效——即不含 DBMS_RANDOM.VALUE、UTL_HTTP、自治事务、PRAGMA AUTONOMOUS_TRANSACTION 的纯 SQL/PL/SQL 请求。一旦语句里调用了不可重放函数,整个请求会被标记为不可重放,AC 自动降级为普通 TAF 行为。这点在压力测试中很难暴露,要专门构造含序列、SYSDATE、NEXTVAL 的事务做断连验证。











