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 and REASSOCIATE_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增强以及合理使用的更多相关文章

  1. Flashback Data Archive ( Oracle Total Recall ) introduced in 11g

    Flashback Data Archive feature is part of Oracle Total Recall technology. Flashback Data Archive fea ...

  2. Oracle 闪回归档(Flashback Data Archive)

    --检查权限 SELECT * FROM dba_sys_privs WHERE privilege LIKE '%FLASH%'; --设置权限 GRANT dba TO testuser;--设置 ...

  3. 11G新特性 -- flashback data archive(1)

    虽然可以依赖undo数据来查询row的旧版本数据,甚至可以执行逻辑恢复.但是你不能期待在undo中找到非常旧的数据.undo数据主要是用来提供读一致性. 在11G中,提供了Flashback Data ...

  4. oracle flashback data archive闪回数据归档天坑之XID重用导致闪回查询数据重复

    我们有个系统使用了Oracle flashback data archive闪回数据归档特性来作为基于时间点的恢复机制,在频繁插入.更新期间发现SYS_FBA_HIST_NNNN表中的XID被两个事务 ...

  5. 闪回之 Flashback Data Archive

    背景:Oracle 11g 中 Flashback Data Archive 特性.将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和 undo 区别开来,这样就可以为 ...

  6. flashback data archive (转)

    闪回数据归档(Flashback Data Archive) 在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档 ...

  7. [每日一题] 11gOCP 1z0-053 :2013-09-29 Flashback Data Archive ...................................6

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12205299 正确答案:A 具体请参考:http://blog.csdn.net/guoy ...

  8. 11G新特性 -- flashback data archive(2)

    创建Flashback Data Archive用户需要授予dba或flashback archive administer系统特权.flashback archive administer系统特权包 ...

  9. [每日一题] 11gOCP 1z0-053 :2013-10-11 Flashback Data Archive属性.........................43

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12656897 正确答案:BD 闪回数据归档请参考:http://blog.csdn.net ...

随机推荐

  1. Ext.create细节分析

    var win1 = Ext.create('Ext.window.Window', { //实例化方法四 : 使用 完整的 Extjs 类名 width: 800, title: 'define t ...

  2. 将多行按分隔符"|"合成一行

    原数据文件s.txt api_test account info 参数错误 合并后数据格式 api_test|account||参数错误||||| 方法介绍: 1.sed + xargs sed 's ...

  3. Kotlin Linux下的环境搭建

    Kotlin是JVM世界里的未来主宰,不管你信不信,我反正相信了! 好吧,如果你不糊涂,就跟着我一起学学吧,哈哈 一下载https://github.com/JetBrains/kotlin/rele ...

  4. Tomcat任意文件上传漏洞CVE-2017-12615

    文章来源:https://blog.csdn.net/qq1124794084/article/details/78044756 漏洞影响的tomcat版本为tomcat7.0.0-7.0.81版本 ...

  5. CentOS7.5 防火墙指令

    防火墙指令 1. 查看防火墙状态: firewall-cmd --state 2. 启动防火墙 systemctl start firewalld.service 3. 关闭防火墙 systemctl ...

  6. Docker服务端和客户端

    Docker是一个客户端-服务端(c/s)的架构程序

  7. Android -- ViewGroup源码分析+自定义

    1,我们前三篇博客了解了一下自定义View的基本方法和流程 从源码的角度一步步打造自己的TextView 深入了解自定义属性 onMeasure()源码分析 之前,我们只是学习过自定义View,其实自 ...

  8. tfs分支操作

    1.在代码管理器中找到代码项 右击——分支与合并——分支——默认所有选项——确定. 2.可能刚打出的分支为红色,签入,修改代码,待测试后代码合并到主干中(下拉选出他的上级,一般为主干),删除分支. 3 ...

  9. META标签之关键词、网页描述设置帮助SEO网站优化(转)

      ASP.NET 4.0 Web Forms针对SEO改进措施中有一个是在Page类中加了2个新属性:MetaKeywords 和MetaDescription,它们使得在后台代码类中用编程的手法设 ...

  10. 为什么C++函数形参默认值从最末一个赋值?

    [1]函数调用时形参的压栈顺序 1.示例代码如下(VS2010): #include <iostream> using namespace std; ); void fun(int a, ...