借助Oracle 11g的Total Recall组件,Oracle会对数据表数据的变化进行自动的跟踪记录,记录在设置的flashback archive里。这个过程中,Oracle会进行相应的优化工作,将归档数据进行压缩、分区。这样做的效果可以在最小影响应用程序DML操作,并且对应用程序透明的情况下将数据进行归档保存。
为了实现Flashback Archive的功能,Oracle新引入了一个实例进程为FBDA(Flashback Archived Process)。该进程启动时随着数据库同时启动。FBDA的作用如下:
- FBDA首先从buffer cache中的undo表空间数据中查找过去数据表时间点数据。这点是与flashback query的特性相似;
- 如果要查找的数据在undo tablespace中,但是该块没有在buffer cache中。FBDA会从undo segment中获取到数据块,复 制在buffer cache中;
- 当进行flashback archive操作的数据表发生修改的时候,FBDA会去将需要保存的数据存放在对应的适当内部数据表中。
注意:默认情况下fbda进程是不运行的。如果当前存在使用flashback archive功能的数据表,就会自动启动fbda进程。
归档数据在flashback archive中是压缩进行保存的,称为history table历史表。在内部,历史表时被压缩并且分区保存的。当保存的归档数据超过了设置的retention时间间隔,旧数据会被自动的删除purge。
6. Flashback Archive中的隐含表
Oracle 11g中的Flashback Archive本质是将数据表的变化信息加以保存,其中使用压缩和分区表技术。当我们将一个数据表设置为flashback archive之后,会发现出现三个内部internal数据表。
- SYS_FBA_TCRV_XXX数据表负责记录在特定的时间范围(对应SCN范围),进行特定操作的信息记录;
- SYS_FBA_HIST_XXX数据表的列包括数据行信息和对应存在的SCN范围。如果一个数据表发生DML或者DDL操作,引起数据的变化会直接保存在该数据表中;
- SYS_FBA_DDL_COLMAP_XXX数据表负责记录数据表列DDL变化情况。从数据列的信息来看,就是一个特定的数据列的时间SCN范围;
7. Flashback Archive下的数据表查询执行计划
当使用flashback archive的时候,虽然书写查询query的格式同过去的flashback query基本相同。但是实际上,对应的执行计划完全不同。
通过执行计划我们可以清晰的看出flashback archive的特征:
- 对具有flashback archive特性的数据表进行历史数据query的时候,输入到优化器中的执行计划就已经发生变化。隐含的对数据表T以及内部表的检索查询。将时间范围转化为对应的SCN条件,获取对应时间片段的数据镜像;
- 从执行计划看,三个数据表结合的大规模操作访问效率不会很高。对内部压缩数据表的访问,可能意味着在进行历史归档的查询时效率不会很高。从实际使用看,flashback archive查询的性能与flashback query的相差很多。
8. Flashback archive容量实验
在官方的推荐意见中,通常是建议设置一个较大或者可以拓展的flashback archive存储区。对于一些数据操作频繁的数据表,即使压缩的历史数据量也是客观的。
c在创建flashback archive的时候,我们使用了retention参数,表示历史数据保留的时间范围。这个retention时间段是具有强制意义的,对Oracle而言反映了绝对的要求。如果历史数据归档的历史期超过了指定时间范围,这部分历史数据会自动的由Oracle进行保存。
但是,如果我们设置的flashback archive空间过小,而数据表变动产生了闪回归档数据量超过了设置空间,这种情况下Oracle如何进行决断呢?
如果使用数据表T设置的闪回归档空间不足,而旧数据又没有达到retention归档的范围,此时Oracle会拒绝所有会产生flashback archive的操作。
当拒绝操作的时候,当前会话会被hange住。如果是一个DDL操作,即使将客户端会话切断,也不能终止操作,仍然可以看到后台会话和Server Process。实验中,笔者是使用OS级别的kill -9命令加以终止。
结论:在使用flashback archive的时候,要尽可能设置合理的retention期间和空间大小。不要由于空间问题引起会话操作hange死。
下篇中,我们着重讨论与flashback archive相关的权限问题和DML/DDL操作对闪回归档的影响。