Oracle Flashback Archive——Oracle闪回归档(中)

 

Flashback archiveOracle 11g中推出的新历史数据查询新特性。对比过去的flashback queryflashback archive具有更强的时间准确和对象针对性。

 

 

5Flashback Archive组件和FBDA进程

 

Flashback Archive特性是Oracle 11g中新推出的。每个新特性的推出,大都伴随着Oracle体系结构的不断丰富和调整。

 

Oracle Total Recall组件是Flashback Archive功能的组件名称。作为一个独立组件在Oracle安装的时候是会进行默认安装的。从Oracle 官方资料中看,Flashback archive的作用是跟踪一个或者多个数据表的历史history数据变化,将其保存在一个或者多个表空间中。

 

 

借助Oracle 11gTotal Recall组件,Oracle会对数据表数据的变化进行自动的跟踪记录,记录在设置的flashback archive里。这个过程中,Oracle会进行相应的优化工作,将归档数据进行压缩、分区。这样做的效果可以在最小影响应用程序DML操作,并且对应用程序透明的情况下将数据进行归档保存。

 

 

为了实现Flashback Archive的功能,Oracle新引入了一个实例进程为FBDAFlashback 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

 

 

6Flashback 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范围;

 

 

7Flashback 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的相差很多;

 

 

8flashback 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

 

 

我们创建了一个容量为10mflashback 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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值