oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用
oracle的闪回很早就出来了,准确的说一直以来应该都较少被真正用户广为使用,除了dba和极少部分开发人员偶尔用于逻辑出错、误删恢复之外,较少被用于产生更有价值的用途。
各种闪回表flashback table、flashback query、flashback transaction都有一定的适用场景,但是他们称不上和其他特性比如分区、并行那么自然和普遍适用性,同时数据存储在撤销表空间,而撤销表空间的性能对系统影响极大,大量的undo保留着会使得更多的顺序读变成随机读。直到oracle 11g开始引入的Flashback Data Archive闪回数据归档,它原先属于 (Oracle Total Recall)选项的唯一功能,后来并合并到了advanced compression选项中,June 2013开始不专门收费。虽然11gR1就引入了闪回数据归档,可以说这个时候是适用于纯OLTP场景的,但是纯粹的OLTP其实帮助并不是很大,因为交易出错是正常的一部分,而且不管是否出错、对账都是标准的一部分,这可以通过应用解决。金融批处理的特性在于相对存量而言、增量不是很大,逻辑巨复杂、很可能经常会出现少数交易异常、某个环节异常需要重新计算,因为考虑到增量也可能突然会有成千上百万,所以我们会使用各种特性去提高性能,并行、分区、直接路径、nologging、truncate等等,对于多租户,增加分区也是可以的。
根据https://oracle-base.com/articles/11g/flashback-and-logminer-enhancements-11gr1以及官方资料,11gR2支持各常用ddl,起码truncate是支持的,实际测试下来11.2.0.1仍然是不支持的,升级到11.2.0.1之后才支持(测试用的版本是11.2.0.4可以支持),12cR1的增强User-Context Tracking,不能说完全没有意义,但是算是个鸡肋,因为涉及到逻辑正确性,基本不会有应用愿意依赖他,跟VPD差不多。
In addition, there are certain DDL restrictions associated with having flashback archiving enabled in 11gR1. The following operations result in a ORA-55610 error.
ALTER TABLE
statements that drop, rename or modify columns.ALTER TABLE
statements that performs partition or subpartition operations.ALTER TABLE
statements that converts a LONG column to a LOB column.ALTER TABLE
statements that includes an UPGRADE TABLE clause, with or without an INCLUDING DATA clause.DROP TABLE
statements.RENAME TABLE
statements.TRUNCATE TABLE
statements.
In 11gR2 some of these restrictions have been removed and the following DDL is supported.
- Add, drop, rename or modify column.
- Drop or truncate partitions.
- Rename or truncate tables.
- Add, drop, rename or modify constraints.
- More complex DDL can be performed in conjunction with the
DISASSOCIATE_FBA
andREASSOCIATE_FBA
procedures of the DBMS_FLASHBACK_ARCHIVE package(比如说增加分区、删除分区).
对于存量基数大,增量相对小的处理来说,FDA可能是最合适的适用场景,他可以让我不用为每个环节创建那么多的备份,直接在FDA中保留指定时间指定表的undo(这应该算提供了最大的灵活性,直接就是create/alter table的一个选项,维护成本最小化),保留时间长度支持天、月、年,不支持小时以及更小单位(这并不总是合适,有时候为了节省空间,我们真的就不需要超过1天)。
再好的特性,如果限制太多或者和其他特性冲突太多,就没什么价值了,所以先看FDA的限制,截止11.2.0.4,默认不支持新增分区,但可以通过DBMS_FLASHBACK_ARCHIVE支持,同时仍然可以闪回查询。它的原理是有一个后台进程不停地异步读取UNDO,写到一个用于闪回归档的表空间,进而最小化对前台的影响,如下所示。
从测试来看,从几行到数十万每行6KB多记录的DELETE来看,确实前台没什么感知,但是truncate性能会下降,大数据量相当于执行了DELETE,空表truncate都在7秒多(根据sql_trace,因为维护后台SYS_FBA_TCRV_n所致,采用了NL循环,截止11.2.0.4所致
)。
FDA还可以用来直接作为flashback table的源头,比如flashback table CUSTOMER1 to timestamp systimestamp - 30/1440;
再看下flashback table 物化视图的基表,会出现ORA-08194: Flashback Table operation is not allowed on materialized views,见How to flashback MVs and MV referred tables [ID 781112.1],这也不奇怪,因为flashback的原理是直接拿undo替换现在的数据块,而MV有些类似redo机制,这没法直接实现(哪怕让用户自己控制flashback mv避免重新全量也好刷新也好啊,起码目前没有,不过已经有内部的request https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:9537333800346745966)。所以,如果用来物化视图,只能通过flashback query as of scn查到当时的快照,然后delete/insert自定义业务回滚。如果只有insert/update,这就比较简单了,使用ORA_ROWSCN机制进行撤销即可,但是如果有delete就只能参考前者自定义排查有哪些变更了(最好是通过逻辑删除标记来实现简化恢复)。其次,如果需要恢复部分数据,也不能直接用flashback table,只能用flashback query。
FDA总体来说,还是能够解决不少问题的。
假设要恢复部分增加、修改、删除,目标是避免备份 表、最小化恢复成本、最小化对空间的需求、undo不扩张、不影响现有物化视图,启用行依赖(用于支持truncate、add column、modify column)、启用FDA。测试场景如下:
场景1:
1、下午15:00开始运行
2、17:15 要恢复X托管人W产品的记录,有新增、修改、删除;
delele from pdt where where 托管人=X and 产品=W; #删除当前的
insert into pdt select * from pdt as of timestamp = 15:00 where 托管人=X and 产品=W; #恢复原来的
场景2(并行进行):
1、下午15:00开始运行
2、17:19 要恢复Y托管人的记录,有新增、修改、删除、truncate;
delele from pdt where where 托管人=Y #删除当前的
insert into pdt select * from pdt as of timestamp = 15:00 where 托管人=Y #恢复原来的
场景3(这种场景分情况:1、变更数据量占整个的比例较低,比如说1/4以下,直接删掉,insert性能就太低了,而且会严重影响物化视图刷新和redo生成
2、比例较大,1/3以上,可以直接delete/insert
这里重点看第1种,没有物化视图的话,直接flashback table就可以了):
1、下午15:00开始运行
2、17:19 全部变更恢复到15:00,有新增、修改、删除、truncate;
select ora_rowscn,pk from pdt where ora_rowscn > 15:00的时间戳,新增、修改的都已经查出来(最好是限定必要的条件,如果表特别大、而变更相对比较少的话)
delete from pdt where pk = 第一步查出来的pk #此时,新增修改的全部删掉
insert into pdt select * from pdt as of timestamp = 15:00 where pk = 第一步查出来的pk #新增、修改的全部恢复完成
期间删除的pk只能业务记录,通过触发器或者其他机制,这样就只有删除会额外增加成本,其他不受影响。
insert into pdt select * from pdt as of timestamp = 15:00 where pk = 业务记录的删除的pk
在此期间、物化视图同步正常进行、不受影响,undo大小不受影响,只要表空间足够、可恢复当前系统时间-24小时内任何时间点。其中X、Y、W开发人员需要自己知道上下文信息。
实现方式:
0、分区表归历史,历史的不动。
1、需要恢复的建表语句增加选项 flashback archive、ENABLE ROW MOVEMENT(如果可能DDL的话)、ROWDEPENDENCIES(需要满足场景3的话);
2、新增、修改分区改为:
begin
DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA(user, 'CUSTOMER1');
end;
/ alter table CUSTOMER1 add partition CUS_PART7 VALUES LESS THAN (700000) ; begin
DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA(user, 'CUSTOMER1');
end;
/
3、需要恢复的点通过select dbms_flashback.get_system_change_number from dual;记录SCN。
上述模式理论上可行,可以简化不少开发并且提高系统运行性能。最近测试闪回的时候出现一个天坑,参见oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复,问题已解决,参见其。
FDA上的表还有一个限制,如下:
if v_rowcount > 0 then
execute immediate 'create table ta_treliqcpdatatmp as select * from ta_tacconet';
execute immediate 'drop table ta_tacconet'; -- drop语句会suspend,查看v$session发现其在等待fbar timer事件
end if;
要使得drop立刻完成,需要禁用fda,如下:
execute immediate 'alter table ta_taccoinfo no flashback archive';
execute immediate 'drop table ta_taccoinfo';
这样就不会卡住了。
oracle闪回、闪回数据归档Flashback Data Archive (Oracle Total Recall)的真正强大之处、11gR2增强以及合理使用的更多相关文章
- Flashback Data Archive ( Oracle Total Recall ) introduced in 11g
Flashback Data Archive feature is part of Oracle Total Recall technology. Flashback Data Archive fea ...
- Oracle 闪回归档(Flashback Data Archive)
--检查权限 SELECT * FROM dba_sys_privs WHERE privilege LIKE '%FLASH%'; --设置权限 GRANT dba TO testuser;--设置 ...
- 11G新特性 -- flashback data archive(1)
虽然可以依赖undo数据来查询row的旧版本数据,甚至可以执行逻辑恢复.但是你不能期待在undo中找到非常旧的数据.undo数据主要是用来提供读一致性. 在11G中,提供了Flashback Data ...
- oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复
我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...
- 闪回之 Flashback Data Archive
背景:Oracle 11g 中 Flashback Data Archive 特性.将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为 ...
- flashback data archive (转)
闪回数据归档(Flashback Data Archive) 在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档 ...
- [每日一题] 11gOCP 1z0-053 :2013-09-29 Flashback Data Archive ...................................6
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12205299 正确答案:A 具体请参考:http://blog.csdn.net/guoy ...
- 11G新特性 -- flashback data archive(2)
创建Flashback Data Archive用户需要授予dba或flashback archive administer系统特权.flashback archive administer系统特权包 ...
- [每日一题] 11gOCP 1z0-053 :2013-10-11 Flashback Data Archive属性.........................43
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12656897 正确答案:BD 闪回数据归档请参考:http://blog.csdn.net ...
随机推荐
- Ext.create细节分析
var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...
- 将多行按分隔符"|"合成一行
原数据文件s.txt api_test account info 参数错误 合并后数据格式 api_test|account||参数错误||||| 方法介绍: 1.sed + xargs sed 's ...
- Kotlin Linux下的环境搭建
Kotlin是JVM世界里的未来主宰,不管你信不信,我反正相信了! 好吧,如果你不糊涂,就跟着我一起学学吧,哈哈 一下载https://github.com/JetBrains/kotlin/rele ...
- Tomcat任意文件上传漏洞CVE-2017-12615
文章来源:https://blog.csdn.net/qq1124794084/article/details/78044756 漏洞影响的tomcat版本为tomcat7.0.0-7.0.81版本 ...
- CentOS7.5 防火墙指令
防火墙指令 1. 查看防火墙状态: firewall-cmd --state 2. 启动防火墙 systemctl start firewalld.service 3. 关闭防火墙 systemctl ...
- Docker服务端和客户端
Docker是一个客户端-服务端(c/s)的架构程序
- Android -- ViewGroup源码分析+自定义
1,我们前三篇博客了解了一下自定义View的基本方法和流程 从源码的角度一步步打造自己的TextView 深入了解自定义属性 onMeasure()源码分析 之前,我们只是学习过自定义View,其实自 ...
- tfs分支操作
1.在代码管理器中找到代码项 右击——分支与合并——分支——默认所有选项——确定. 2.可能刚打出的分支为红色,签入,修改代码,待测试后代码合并到主干中(下拉选出他的上级,一般为主干),删除分支. 3 ...
- META标签之关键词、网页描述设置帮助SEO网站优化(转)
ASP.NET 4.0 Web Forms针对SEO改进措施中有一个是在Page类中加了2个新属性:MetaKeywords 和MetaDescription,它们使得在后台代码类中用编程的手法设 ...
- 为什么C++函数形参默认值从最末一个赋值?
[1]函数调用时形参的压栈顺序 1.示例代码如下(VS2010): #include <iostream> using namespace std; ); void fun(int a, ...