Flashback archive是Oracle 11g中推出的新历史数据查询新特性。对比过去的flashback query,flashback archive具有更强的时间准确和对象针对性。
5、Flashback Archive组件和FBDA进程
Flashback Archive特性是Oracle 11g中新推出的。每个新特性的推出,大都伴随着Oracle体系结构的不断丰富和调整。
Oracle Total Recall组件是Flashback Archive功能的组件名称。作为一个独立组件在Oracle安装的时候是会进行默认安装的。从Oracle 官方资料中看,Flashback archive的作用是跟踪一个或者多个数据表的历史history数据变化,将其保存在一个或者多个表空间中。
借助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会去将需要保存的数据存放在对应的适当内部数据表中;
[oracle@oracle11g ~]$ ps -ef | grep fbda
oracle 5773 1 1 13:02 ? 00:00:00 ora_fbda_wilson
oracle 5775 5560 0 13:03 pts/0 00:00:00 grep fbda
注意,默认情况下fbda进程是不运行的。如果当前存在使用flashback archive功能的数据表,就会自动启动fbda进程。
归档数据在flashback archive中是压缩进行保存的,称为history table历史表。在内部,历史表时被压缩并且分区保存的。当保存的归档数据超过了设置的retention时间间隔,旧数据会被自动的删除purge。
6、Flashback Archive中的隐含表
Oracle 11g中的Flashback Archive本质是将数据表的变化信息加以保存,其中使用压缩和分区表技术。当我们将一个数据表设置为flashback archive之后,会发现出现三个内部internal数据表。
SQL> desc SYS_FBA_TCRV_88294;
Name Type Nullable Default Comments
-------- -------------- -------- ------- --------
RID VARCHAR2(4000) Y
STARTSCN NUMBER Y
ENDSCN NUMBER Y
XID RAW(8) Y
OP VARCHAR2(1) Y
SQL> desc SYS_FBA_HIST_88294
Name Type Nullable Default Comments
-------------- -------------- -------- ------- --------
RID VARCHAR2(4000) Y
STARTSCN NUMBER Y
ENDSCN NUMBER Y
XID RAW(8) Y
OPERATION VARCHAR2(1) Y
OWNER VARCHAR2(30) Y
OBJECT_NAME VARCHAR2(128) Y
(篇幅原因,有省略……)
EDITION_NAME VARCHAR2(30) Y
SQL> desc SYS_FBA_DDL_COLMAP_88294;
Name Type Nullable Default Comments
---------------------- ------------- -------- ------- --------
STARTSCN NUMBER Y
ENDSCN NUMBER Y
XID RAW(8) Y
OPERATION VARCHAR2(1) Y
COLUMN_NAME VARCHAR2(255) Y
TYPE VARCHAR2(255) Y
HISTORICAL_COLUMN_NAME VARCHAR2(255) Y
ü 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基本相同。但是实际上,对应的执行计划完全不同。
SQL> explain plan for select count(*) from t as of timestamp to_timestamp('2011/9/6 9:06:57','yyyy/mm/dd hh24:mi:ss');
Explained
SQL> select * from table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 2132445860
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | | 1541
| 1 | SORT AGGREGATE | | 1 | |
| 2 | VIEW | | 10394 | | 1541
| 3 | UNION-ALL | | | |
|* 4 | FILTER | | | |
| 5 | PARTITION RANGE SINGLE| | 339 | 8814 | 173
|* 6 | TABLE ACCESS FULL | SYS_FBA_HIST_88294 | 339 | 8814 | 173
|* 7 | FILTER | | | |
|* 8 | HASH JOIN OUTER | | 10055 | 19M| 1368
|* 9 | TABLE ACCESS FULL | T | 4309 | 51708 | 1057
|* 10 | TABLE ACCESS FULL | SYS_FBA_TCRV_88294 | 201K| 388M| 310
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
4 - filter("TIMESTAMP_TO_SCN"(TIMESTAMP' 2011-09-06 09:06:57.000000000')<1340
6 - filter("ENDSCN"<=13407208 AND "ENDSCN">"TIMESTAMP_TO_SCN"(TIMESTAMP' 2011
09:06:57.000000000') AND ("STARTSCN" IS NULL OR "STARTSCN"<="TIMES
09:06:57.000000000')))
7 - filter("STARTSCN"<="TIMESTAMP_TO_SCN"(TIMESTAMP' 2011-09-06 09:06:57.0000
NULL)
8 - access("T".ROWID=CHARTOROWID("RID"(+)))
9 - filter("T"."VERSIONS_STARTSCN" IS NULL)
10 - filter(("ENDSCN"(+) IS NULL OR "ENDSCN"(+)>13407208) AND ("STARTSCN"(+) I
"STARTSCN"(+)<13407208))
Note
-----
- dynamic sampling used for this statement (level=2)
35 rows selected
通过执行计划我们可以清晰的看出flashback archive的特征:
ü 对具有flashback archive特性的数据表进行历史数据query的时候,输入到优化器中的执行计划就已经发生变化。隐含的对数据表T以及内部表的检索查询。将时间范围转化为对应的SCN条件,获取对应时间片段的数据镜像;
ü 从执行计划看,三个数据表结合的大规模操作访问效率不会很高。对内部压缩数据表的访问,可能意味着在进行历史归档的查询时效率不会很高。从实际使用看,flashback archive查询的性能与flashback query的相差很多;
8、flashback archive容量实验
在官方的推荐意见中,通常是建议设置一个较大或者可以拓展的flashback archive存储区。对于一些数据操作频繁的数据表,即使压缩的历史数据量也是客观的。
在创建flashback archive的时候,我们使用了retention参数,表示历史数据保留的时间范围。这个retention时间段是具有强制意义的,对Oracle而言反映了绝对的要求。如果历史数据归档的历史期超过了指定时间范围,这部分历史数据会自动的由Oracle进行保存。
但是,如果我们设置的flashback archive空间过小,而数据表变动产生了闪回归档数据量超过了设置空间,这种情况下Oracle如何进行决断呢?
SQL> show user
User is "SYS"
SQL> create flashback archive flar2 tablespace mytest quota 10m retention 1 year;
Done
我们创建了一个容量为10m的flashback archive空间,要求保留一年的时间。
SQL> grant flashback archive on flar2 to scott;
Grant succeeded
SQL> alter table t flashback archive flar2;
Table altered
SQL> select sysdate from dual;
SYSDATE
--------------------
2011/9/6 15:25:21
SQL> select count(*) from t;
COUNT(*)
----------
72226
(进行频繁的DML操作)
--在一个DDL操作之后,数据操作hange住
SQL> truncate table t;
如果使用数据表T设置的闪回归档空间不足,而旧数据又没有达到retention归档的范围,此时Oracle会拒绝所有会产生flashback archive的操作。
当拒绝操作的时候,当前会话会被hange住。如果是一个DDL操作,即使将客户端会话切断,也不能终止操作,仍然可以看到后台会话和Server Process。实验中,笔者是使用OS级别的kill -9命令加以终止。
结论:在使用flashback archive的时候,要尽可能设置合理的retention期间和空间大小。不要由于空间问题引起会话操作hange死。
下篇中,我们着重讨论与flashback archive相关的权限问题和DML/DDL操作对闪回归档的影响。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-706861/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17203031/viewspace-706861/