闪回数据归档(Flashback Data Archive)
在Oracle 11g当中,对闪回技术再次进行了扩展,提供了一个全新的flashback方式,称之为闪回数据归档,本节我们将对闪回数据归档进行介绍。
一 闪回数据归档概念
在这里让我们从Oracle 9i开始引进的Flashback Query说起,这是Oracle第一次引入闪回技术,该技术使得一些逻辑误操作不再需要利用归档日志和数据库备份进行时间点恢复。
而在Oracle 10g当中,更是引入flashback version query、flashback transaction query、flashback database、flashback table和flashback drop等特性,大大简化了Flashback Query的使用。
在上面的诸多闪回技术当中,除了Flashback Database(依赖于闪回日志)之外,其他的闪回技术都是依赖于Undo撤销数据,都与数据库初始化参数UNDO_RETENTION密切相关(该参数决定了撤销数据在数据库中的保存时间)。它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。而undo段是循环使用的,只要事务提交,之前的undo信息就可能被覆盖,虽然可以通过 undo_retention等参数来延长undo的存活期,但这个参数会影响所有的事务,设置过大,可能导致undo tablespace快速膨胀。
Oracle 11g则为flashback家族又带来一个新的成员:Flashback Data Archive。该技术与以上所说的诸多闪回技术的实现机制不同,通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo区别开来,这样就可以为闪回归档区单独设置存储策略,使之可以闪回到指定时间之前的旧数据而不影响undo策略。并且可以根据需要指定哪些数据库对象需要保存历史变化数据,而不是将数据库中所有对象的变化数据都保存下来,这样可以极大地减少空间需求。
注意,Flashback Data Archive并不是记录数据库的所有变化,而只是记录了指定表的数据变化。所以,Flashback Data Archive是针对对象的保护,是Flashback Database的有力补充。
通过Flashback Data Archive,可以查询指定对象的任何时间点(只要满足保护策略)的数据,而且不需要用到undo,这在有审计需要的环境,或者是安全性特别重要的高可用数据库中,是一个非常好的特性。缺点就是如果该表变化很频繁,对空间的要求可能很高。
二 闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,可以有一个默认的闪回数据归档区,也可以创建其他许多的闪回数据归档区域。
每一个闪回数据归档区都可以有一个唯一的名称。同时,每一个闪回数据归档区都对应了一定的数据保留策略。例如可以配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。以后如果将表放到对应的闪回数据归档区,则就按照该归档区的保留策略来保存历史数据。
闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间,来保存表的修改历史,这样就摆脱了对Undo撤销数据的依赖,不利用undo就可以闪回到归档策略内的任何一个时间点上。
创建闪回数据归档区可以使用CREATE FLASHBACK ARCHIVE…命令完成。
下面我们通过一些实例来演示如何来创建闪回数据归档区。
1.创建一个系统默认的、磁盘限额为100MB、保留策略为1年的闪回数据归档区
SQL>create flashback archive default fbar_1 tablespace "USERS" 2 quota 100M
2 retention 1 year;
注意,经过笔者自己在Oracle 11g数据库上运行该语句发现,必须对tablespace关键字后面的表空间名称用" "引起来,否则无法运行成功。
2.在TBS_DATA1上创建fbar_2闪回数据归档区,保留策略为2天
SQL>CREATE FLASHBACK ARCHIVE fbar_2 TABLESPACE "TBS_DATA1"
2 RETENTION 2 DAY;
一个归档区可以不仅仅对应一个表空间,可以采用如下的命令增加或者删除该归档区的表空间的个数,这样也达到了增加或者减少该归档区空间的目的。
3.给数据归档区fbar_2增加一个表空间
SQL>ALTER FLASHBACK ARCHIVE fbar_2 ADD TABLESPACE "TBS_DATA2"
2 QUOTA 100M;
也可以从归档区中删除表空间。注意:这个删除仅仅是表示从数据归档区删除,并不是删除该表空间。
4.删除数据归档区fbar_2的表空间TBS_DATA2
SYS>ALTER FLASHBACK ARCHIVE fbar_2 REMOVE TABLESPACE "TBS_DATA2";
对已经分配给闪回数据归档区的表空间,可以修改归档区对应的磁盘限额。
5.修改归档区的磁盘限额
SYS>ALTER FLASHBACK ARCHIVE fbar_2 MODIFY TABLESPACE "TBS_DATA2"
2 QUOTA 200M;
6.修改归档区的保留策略
SYS>ALTER FLASHBACK ARCHIVE fbar_1 MODIFY RETENTION 1 month;
三 使用闪回数据归档
闪回数据归档区创建完成以后,就可以指定特定的表,使其对应到特定的数据归档区。把表指定到对应的数据归档区有两种方法,一是在创建的时候直接指定归档区,一种是对现有的表指定一个归档区。
注意,如果不指定归档区的名称,则指定到默认归档区,否则,就属于指定的数据归档区。
以下我们基于上一小节所创建的两个闪回数据归档区fbar_1(默认的闪回数据恢复区)和fbar_2,创建了3个表,一个指定到默认归档区fbar_1,一个指定到数据归档区fbar_2,另外一个为了进行对比,没有指定到任何数据归档区。
(1)创建表:
SYS@11gR1>connect scott/tiger
Connected.
scott@11gR1>create table test1(a int) flashback archive;
Table created.
scott@11gR1>create table test2(b int);
Table created.
scott@11gR1>alter table test2 flashback archive data_test2;
Table altered.
scott@11gR1>create table test3(c int);
Table created.
(2)在表中插入数据,完成以后,做select查询显示如下:
09:33:38 scott@11gR1>select * from test2;
B
----------
4
5
6
09:33:43 scott@11gR1>select * from test3;
C
----------
7
8
9
09:33:46 scott@11gR1>select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time from dual;
TIME
----
2007-09-04 09:33:52
可以看到,这些数据是在9:33分左右写进去的。最新数据保留策略应当是,表test1对应的是默认的数据归档区fbar_1,数据保留策略是一个月,表test2对应的是数据归档区fbar_2,数据保留策略是2天,而表test3没有数据保留策略。
然后,对这3个表再进行一些操作,如删除现有记录,并插入一些新记录。最后,不使用undo数据,查询时间点2007-09-04 09:33:52,看是否能找回原来的数据。
(3)对表进行更新操作,查询显示结果:
09:34:19 Piner@11gR1>delete from test1;
3 rows deleted.
09:34:23 Piner@11gR1>delete from test2;
3 rows deleted.
09:34:30 Piner@11gR1>delete from test3;
3 rows deleted.
09:34:35 Piner@11gR1>insert into test1 values(10);
1 row created.
09:34:47 Piner@11gR1>insert into test2 values(20);
1 row created.
09:34:53 Piner@11gR1>insert into test3 values(30);
1 row created.
09:34:58 Piner@11gR1>commit;
Commit complete.
09:36:32 Piner@11gR1>select * from test1;
A
----------
10
09:36:51 Piner@11gR1>select * from test2;
B
----------
20
09:36:56 Piner@11gR1>select * from test3;
C
----------
30
(4)利用Flashback功能去查询数据,发现可以获得正确的数据,但是,不能确认的是,这些数据的获得到底是经过undo获得的还是数据归档区获得的。
09:43:17 Piner@11gR1>select * from test1 as of timestamp
09:43:17 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
A
----------
1
2
3
09:43:17 Piner@11gR1>select * from test2 as of timestamp
09:43:24 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
B
----------
4
5
6
09:43:25 Piner@11gR1>select * from test3 as of timestamp
09:43:30 2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
C
----------
7
8
9
(5)为了证明查询使用的是闪回数据归档,创建新的undo表空间,切换undo表空间,为了确保生效,可以重新启动数据库例程。
切换到新的undo表空间,如果没有,需要重新创建:
SYS@11gR1>ALTER SYSTEM SET undo_tablespace=TBS_UNDO2;
System altered.
删除原来的undo表空间:
SYS@11gR1>drop tablespace UNDOTBS1;
Tablespace dropped.
(6)排除了undo查询的可能,再次执行查询:
scott@11gR1> select * from test3 as of timestamp
2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
select * from test3 as of timestamp
*
ERROR at line 1:
ORA-01555: snapshot too old: rollback segment number with name "" too small
scott@11gR1> select * from test1 as of timestamp
2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
A
----------
1
2
3
scott@11gR1> select * from test2 as of timestamp
2 to_timestamp('2007-09-04 09:33:52', 'yyyy-mm-dd hh24:mi:ss');
B
----------
4
5
6
可以看到,没有设置数据归档策略的表test3,查询的时候会报01555错误。但是,设置过数据归档策略的test1与test2,都能正常查询到数据,可以看到,数据归档生效了。
这里是一个简单的实验,时间可能远远没有达到设置的策略期,但是,却可以证明数据不是经过undo查询而获得的。
四 清除闪回数据归档区数据
前面为大家介绍过如何给闪回数据归档区增加空间,本节通过一些具体实例为大家介绍如何清除闪回归档区中的数据。
1.清除所有归档区的数据
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE ALL;
2.清除一天以前的数据
SQL>ALTER FLASHBACK ARCHIVE data_test1
2 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
3.清除特定SCN之前的数据
SQL>ALTER FLASHBACK ARCHIVE data_test1 PURGE BEFORE SCN 728969;
4.将指定的表不再设置数据归档
SQL>ALTER TABLE test1 NO FLASHBACK ARCHIVE;
5.删除数据归档区
SQL>DROP FLASHBACK ARCHIVE data_test2;
如果将表指定了闪回数据归档区,则不能对表进行如下操作。 |
l 删除,重令名,或者修改列;
l 进行分区或者子分区操作;
l 转换long到lob类型;
l ALTER TABLE… UPGRADE TABLE 操作;
l drop、rename、trunacte表。
例如:
scott@11gR1> drop table test1;
drop table test1
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
17.8.5 与闪回数据归档有关的视图
可有通过以下视图来得到与闪回数据归档有关的信息。
l DBA_FLASHBACK_ARCHIVE:DBA视图,闪回归档区信息。
l DBA_FLASHBACK_ARCHIVE_TS:DBA视图,闪回归档有关表空间。
l DBA_FLASHBACK_ARCHIVE_TABLES:DBA视图,对应表所对应的闪回归档信息。
l USER_FLASHBACK_ARCHIVE:用户闪回归档区的创建信息。
l USER_FLASHBACK_ARCHIVE_TABLES:用户表对应的闪回归档区域。
小结
本章主要讲述了数据库的闪回技术。闪回是数据库进行逻辑恢复的一个快捷工具。对于Oracle 11g在闪回方面的最新技术——闪回数据归档——也进行了详细的介绍。