undo里的before-image受系统负荷等因素的影响保留时间较短有的时候无法完全满足flashback query、flashback version query等闪回查询较早前数据的功能要求,flashback data archive的引入正是为了解决这个问题,将before image从undo定时归档到archive table。
数据库里如果创建了flashback data archive,那么后台进程FBDA(Flashback Data Archiver Process)就会启动,alert.log也会有下面的输出:
Sun May 17 13:35:18 2015
Starting background process FBDA
Sun May 17 13:35:18 2015
FBDA started with pid=35, OS id=12257378
可以在create table的同时启用flashback archive功能,也可以在建完表之后通过Alter table .. flashback archive ...打开flashback archive功能。
当表里的数据块被修改时before image在写入到undo的同时,会在undo block里打上标记,表明这个undo block需要被归档到flashback data archive,这个归档过程就是由FBDA进程完成的,在完成归档之前这个undo block是不能被其他transaction重用的。把undo block归档到flashback data archive的过程是异步进行的,所以对transaction的性能影响可以忽略不计,FBDA每5分钟扫描一次等待被归档的undo block,并将其写入到flashback data archive,随后把该undo block标记为可以重用,如果在系统的修改量较大时扫描的间隔会小于5分钟,具体由Oracle自己控制。
在flashback data archive的技术实现过程中,SYS_FBT_为前缀的表起到了不小的作用,通过下面的实验了解一下
/////////////Part 1. SYS_FBA_表基本介绍////////////////
###数据库已有一个名为FBA0516_1的flashback archive,quota为300M,存放在TS0512_1表空间,FBA0516_1里目前尚未存放任何表的历史数据
SYS@tstdb1-SQL> select * from DBA_FLASHBACK_ARCHIVE;
OWNER_NAME FLASHBACK_ FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS
---------- ---------- ------------------ ----------------- ----------------------------------- ----------------------------------- -------
SYS FBA0516_1 1 1 16-MAY-15 11.46.01.000000000 AM 16-MAY-15 11.46.01.000000000 AM
SYS@tstdb1-SQL> select * from DBA_FLASHBACK_ARCHIVE_TS;
FLASHBACK_ FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
---------- ------------------ ------------------------------ ----------------------------------------
FBA0516_1 1 TS0512_1 300
SYS@tstdb1-SQL> select * from DBA_FLASHBACK_ARCHIVE_TABLES;
no rows selected
###创建测试表
create table t0516_5 (id number,c2 varchar2(3)) flashback archive fba0516_1;
col object_name format a20
set linesize 100
select object_name,created,object_id from dba_objects where object_name='T0516_5';
OBJECT_NAME CREATED OBJECT_ID
-------------------- ----------------- ----------
T0516_5 20150516 20:45:54 36945
---T0516_5对应的archive table是SYS_FBA_HIST_36937,但我们在dba_tables还没有查到SYS_FBA_HIST_36937
col OWNER_NAME format a10
set numwidth 4
col FLASHBACK_ARCHIVE_NAME format a10
col create_time format a35
col last_purge_time format a35
set linesize 140
select * from DBA_FLASHBACK_ARCHIVE_TABLES;
TABLE_NAME OWNER_NAME FLASHBACK_ ARCHIVE_TABLE_NAME STATUS
------------------------------ ---------- ---------- ----------------------------------------------------- -------------
T0516_5 SCOTT FBA0516_1 SYS_FBA_HIST_36945 ENABLED
select owner,table_name,partitioned from dba_tables where table_name like '%36945';
no rows selected
根据官方的说法后台进程FBDA会每隔5分钟检测一次是否有新的archive table要创建,这里等待超过了10分钟也未见SYS_FBA_HIST_36937表创建出来,下面进行一些DML操作后再观察
---插入若干数据
insert into t0516_5 values(1,'AAA');
insert into t0516_5 values(2,'BBB');
insert into t0516_5 values(3,'CCC');
commit;
SCOTT@tstdb1-SQL> select sysdate from dual;
SYSDATE
-----------------
20150516 20:47:06