天天看点

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

Oracle Flashback闪回是从10g开始推出的一系列技术新特性。闪回Flashback的范围很广泛,包括Flashback Query、Flashback Database、Flashback Transaction和Flashback Drop等。

在之前的Blog系列《使用闪回拯救我们的数据》,笔者已经分析过Flashback闪回的一些特性。Flashback就是在不进行还原操作的情况下,将已经被commit或者ddl操作过的数据恢复过来。

Flashback借用多种技术来实现flashback的目标。Flashback存在一些问题和不适应性。比如:进行flashback的对象时间往往较短,而且不可控。另一方面,flashback的目标没有针对性,对一些不需要进行flashback的数据表,也消耗资源进行flashback准备操作。

在Oracle 11g中,Oracle推出了flashback archive(闪回归档)的新特性。Flashback Archive实现了有针对性数据表的可控时间闪回功能。我们可以设置一块存储空间区域,保留一个特定数据表在不同时间的数据镜像。而且可以设置保留时间,没有达到保留时间的时候,数据都会进行保留。

下面我们通过一系列的实验来说明这些特性。

1 、环境准备

我们选择Oracle 11g进行测试,同时建立一个表空间mytest。表空间mytest选择ASSM方式进行segment space management。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE     11.2.0.1.0       Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> create tablespace mytest datafile size 100m extent management local uniform. size 1m

  2  segment space management auto;

Tablespace created

2 、创建Flashback Archive 空间

Flashback的其他特性,如flashback drop、flashback database,都是数据库的默认选择项目,基本不需要用户进行指定和配置。如果不希望有这些配置项目,则可以通过参数配置开关进行关闭。

Flashback Archive是一种比较特殊的类型,需要我们进行一系列的配置工作。首先,我们在sys用户下创建一个flashback archive存储对象。

SQL> show user;

User is "SYS"

SQL> create flashback archive flar1 tablespace mytest retention 1 year;

Done

创建flar1对象作为使用的flashback archive,存储使用的表空间为mytest,设置的保留年限为1年。

在创建flar1之后,我们可以在dba_flashback_archive、dba_flashback_archive_ts(dba_前缀可以使用user等进行替换)查询到闪回信息。

SQL> select * from dba_flashback_archive;

OWNER_NAME FLASHBACK_ARCHI FLASHBACK_ RETENTION_IN_DAYS CREATE_TIME          LAST_PURGE_TIME      STATUS

---------- --------------- ---------- ----------------- -------------------- -------------------- -------

SYS        FLAR1                    1               365 05-9月 -11 11.07.43. 05-9月 -11 11.07.43.

                                                        000000000 上午       000000000 上午      

SQL> select * from dba_flashback_archive_ts;

FLASHBACK_ARCHI FLASHBACK_ARCHIVE#  TABLESPACE_NAME QUOTA_IN_MB

--------------- ----------          --------------- ----------------------------------------

FLAR1                    1          MYTEST         

3 、设置具有闪回归档功能的数据表

我们转移到scott用户下,进行闪回归档演示。

SQL> conn scott/[email protected];

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0

Connected as scott

SQL> desc t;

Object t does not exist.

SQL> create table t as select * from dba_objects;

Table created

SQL> select count(*) from t;

  COUNT(*)

----------

     72226

之后,我们尝试使用alter table xx flashback archive yyy的方法,将数据表与设置的闪回归档区关联上。

SQL> alter table t flashback archive flar1;

alter table t flashback archive flar1

ORA-55620: 无权使用闪回归档

在scott普通用户下,直接调用该命令是被拒绝的。使用设置闪回归档,需要拥有flashback archive系统权限。

--在sys用户下

SQL> grant flashback archive on flar1 to scott;

Grant succeeded

--在scott用户下

SQL> alter table t flashback archive flar1;

Table altered

此时,可以观察到dba_flashback_archive_tables视图的结果,建立了数据表T与flar1的关系。

SQL> select * from dba_flashback_archive_tables;

TABLE_NAME   OWNER_NAME    FLASHBACK_ARCHIVE_NAME     ARCHIVE_TABLE_NAME   STATUS

-------------------------- ----------------------------------------------- --------

T            SCOTT         FLAR1                      SYS_FBA_HIST_88294   ENABLED

4 、闪回归档数据表

下面,我们分别在不同的时间点,对数据表进行DML操作,演示flashback archive特性。

--大规模DML操作前

SQL> select sum(bytes)/1024/1024 "USED MBs" from dba_free_space where tablespace_name='MYTEST';

  USED MBs

----------

        92

SQL> select count(*) from t;

  COUNT(*)

----------

    113346

SQL> select sysdate from dual;

SYSDATE

--------------------

2011/9/6 9:06:57

--进行大规模DML操作;

SQL> insert into t select * from dba_objects;

72233 rows inserted

SQL> commit;

Commit complete

SQL> select count(*) from t;

  COUNT(*)

----------

    185579

SQL> select count(*) from t as of timestamp to_timestamp('2011/9/6 9:06:57','yyyy/mm/dd hh24:mi:ss');

  COUNT(*)

----------

    113346

SQL> select sum(bytes)/1024/1024 "USED MBs" from dba_free_space where tablespace_name='MYTEST';

  USED MBs

----------

        75

上面的实验,可以清晰的看出Flashback Archive的特点。从query语法上看,flashback archive与flashback query很相像,都是利用指定过去的一个时间点(timestamp,scn)进行查询。但是,flashback query是利用undo的负效应,将没有被覆写的数据返回给用户。这种方式首先是对所有的数据表均有效果,另一个是时间有限,受到undo大小和数据库事务频繁度的影响。

而flashback archive则是将数据归档做到了数据库的层面上。设置一块专门的区域空间,称之为flashback archive。这个区域是真实对应在表空间上可以进行存储使用的。之后设置这块区域的保留时间。

在数据表层面,可以选择需要进行保留的数据表,让其与flashback archive区域关联,这样在存储区域中,就会保留各个时间点的镜像数据。

本篇中研究了如何设置和使用flashback archive,下面我们一起分析研究下设置flashback archive的数据表特征和其他特点。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/17203031/viewspace-706778/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17203031/viewspace-706778/