以前,大家可能对SELECT语句的断点续传(即登录一个数据库实例发出select查询,在输出结果过程中,此实例突然崩溃,RAC中存活实例继续输出查询结果,对用户来说完全无感知)十分熟悉,有了TAC,DML、DDL语句也可以做到类似的断点继传功能啦!
接下来就让我来带大家一起领略一下TAC的风采。
最后,需要落地:具体如何实现TAC?
简单四步走起:
使用推荐的连接串 使用支持的客户端版本 应用程序满足条件
正确配置的数据库和集群架构 为特定工作负载创建数据库服务 确保连接字符串使用此数据库服务
识别应用程序中使用的可变函数,DBA授权正确权限
检查相关视图、AWR以获取保护的统计信息 使用ACCHK实用程序识别重放异常
为了让大家更加通俗易懂,我们把实现TAC的详细内容分解归类如下:
1) 要求使用推荐的连接串:
将连接串与内置的超时、重试和延迟一起使用,以便传入的连接在中断期间不会看到错误。
(CONNECT_DATA=(SERVICE_NAME = YOUR SERVICE)))
RAC+ADG环境:
Alias (or URL) =
(DESCRIPTION =
(CONNECT_TIMEOUT= 90)(RETRY_COUNT=50)(RETRY_DELAY=3)(TRANSPORT_CONNECT_TIMEOUT=3)
(ADDRESS_LIST = (LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=primary-scan)(PORT=1521)))
(ADDRESS_LIST = (LOAD_BALANCE=on)(ADDRESS = (PROTOCOL = TCP)(HOST=standby-scan)(PORT=1521)))
Oracle JDBC Replay Driver 18c或更高版本
Oracle Universal Connection Pool (UCP) 18c or later with Oracle JDBC Replay Driver 18c or later.
Oracle WebLogic Server 18c, or third-party JDBC application servers using UCP with Oracle JDBC Replay Driver 18c or later
Java connection pools 或 standalone Java applications using Oracle JDBC Replay Driver 18c or later with Request Boundaries
OCI Session Pool 18c或更高版本
SQL*Plus 18c或更高版本
ODP.NET pooled, Unmanaged Driver 18c or later (“Pooling=true” default in 12.2 and later)
OCI-based applications using 19c OCI driver或更高版本
应用程序在需要时从连接池中获取连接,然后在当前操作完成时将其归还到连接池中。
Oracle建议使用支持FAN的Oracle连接池来屏蔽计划内的维护。当应用程序使用带有FAN的Oracle连接池时,在请求之间将连接返回到池时,对用户没有影响。
当Oracle连接池接收到计划停机的FAN事件时,它会将实例上的所有连接标记为排空。立即关闭已归还的连接,以便不再使用它们。当正在使用的连接返回到池时,它们将被关闭。随着时间的推移会优雅地关闭所有连接。
如果您使用的是基于Java的第三方的Application Server,那么实现排空会话和故障转移的有效方法是用UCP替换现有的数据源连接。许多应用服务器都支持这种方法,包括IBM WebSphere、IBM Liberty、Apache Tomcat、Red Hat WildFly(WildFly(JBoss))、Spring、Hibernate等。Oracle和其他提供商(如IBM)的白皮书描述了如何在这些Application Server上使用UCP。使用UCP作为数据源,可以使用很多UCP的功能,如快速连接故障转移、运行时负载均衡、应用程序连续性和透明的应用程序连续性。
使用连接测试:分为客户端侧(驱动程序)连接测试 、数据库侧(SQL连接测试)。
CDB/PDB名
首选节点,备用节点
是否failback
负载均衡的方式
使用AC 或 TAC
使用事务卫士
重放的时间参数
TAF配置
FAN配置
排空的配置
可变函数(Mutable functions ):是指每次执行时可能返回不同值的函数。
支持保留SYSDATE、SYSTIMESTAMP、LOCAL_TIMESTAMP、 SYS_GUID 、CURRENT_TIMESTAMP和sequence.NEXTVAL可变函数原始结果,如果不保留原始值,并且在重放时将不同的值返回给应用程序,则会拒绝重放。
针对SQL,应用程序连续性19c和更高版本自动启用可变函数的原值重放,因此不需要执行任何操作。
如果您使用PL/SQL的可变函数,或者您使用的是Oracle database 19c之前的数据库版本,那么DBA必须发出GRANT KEEP授权。当授予KEEP权限后,在重放时,会使用原始函数结果,例如:
SQL> CREATE SEQUENCE.. [sequence object] KEEP;
SQL> ALTER SEQUENCE.. [sequence object] KEEP;
SQL> GRANT KEEP DATE TIME TO USER;
SQL> GRANT KEEP SYSGUID TO USER;
SQL> GRANT KEEP SEQUENCE ON [sequence object] TO USER;
应用程序连续性从系统、会话和服务层面收集统计信息,使您能够监视保护级别。统计信息在V$SYSSTAT、V$SESSTAT中可用,并且在启用服务统计信息时,在V$SERVICE_STATS中可用。这些统计信息保存到自动工作负载存储库(AWR)中,并在AWR报告中可用。
set pagesize 60
set lines 120
col Service_name format a30 trunc heading "Service"
break on con_id skip1
col Total_requests format 999,999,9999 heading "Requests"
col Total_calls format 9,999,9999 heading "Calls in requests"
col Total_protected format 9,999,9999 heading "Calls Protected"
col Protected format 999.9 heading "Protected %"
select con_id, service_name, total_requests,
total_calls,total_protected,total_protected*100/NULLIF(total_calls,0) as Protected
from(
select * from
(select a.con_id, a.service_name, c.name,b.value
FROM gv$session a, gv$sesstat b, gv$statname c
WHERE a.sid = b.sid
AND a.inst_id = b.inst_id
AND b.value != 0
AND b.statistic# = c.statistic#
AND b.inst_id = c.inst_id
AND a.service_name not in ('SYS$USERS','SYS$BACKGROUND'))
pivot(
sum(value)
for name in ('cumulative begin requests' as total_requests, 'cumulative end
requests' as Total_end_requests, 'cumulative user calls in requests' as
Total_calls, 'cumulative user calls protected by Application Continuity' as
total_protected) ))
order by con_id, service_name;
启用ACCHK收集保护数据:
SQL> SET SERVEROUTPUT ON FORMAT WRAPPED;
SQL> EXECUTE DBMS_APP_CONT_REPORT.ACCHK_REPORT(DBMS_APP_CONT_REPORT.FULL);
想要了解更多内容,可以参考如下资源:
编辑:范宏伟