为前缀表如何服务于Flashback Data Archive

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cdb7d569b9fe4ad8aa44d7184a208417.html