sitemap

RSS地图

收藏本站

设为首页

Oracle研究中心

当前位置:Oracle研究中心 > 运维DBA >

【学习笔记】oracle Flashback闪回归档 详细研究笔记二

时间:2017-01-08 23:42   来源:Oracle研究中心   作者:网络   点击:

天萃荷净 oracle研究中心学习笔记:分享一篇关于oracle flashback归回归档的研究笔记。

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操作对闪回归档的影响。

--------------------------------------ORACLE-DBA----------------------------------------

最权威、专业的Oracle案例资源汇总之【学习笔记】oracle Flashback闪回归档 详细研究笔记二

本文由大师惜分飞原创分享,网址:http://www.oracleplus.net/arch/1456.html

Oracle研究中心

关键词:

oracle闪回归档

oracle Fashback