1.1.1 闪回数据归档
虽然最新法规(如表Sarbanes-Oxley法案和HIPAA协会)要求严格控制和跟踪消费者和患者 数据的需求,但是,将行上实施的所有变更的历史记录都保留在关键表中很容易出错,而且需 要定制的应用程序或数据库触发器来维护历史变更存储库。
每次创建一个新的应用程序,或在 一个要求历史跟踪的应用程序中更新表时,也必须改变此跟踪应用程序。在Oracle Database 11g 中,可以使用闪回数据归档(Flash Data Archive)自动将所有关键表的历史变更保存管理机构或风险承担者所要求的时间。
闪回数据归档在Oracle Database 11g内部实现。简单地说,创建一个或多个存储库区域(其 中一个是默认区域),为存储库中的对象分配默认的保留期限,然后标识合适的表,以便进行跟踪。
闪回数据归档的操作与撤销表空间非常相似,但是,闪回数据归档只记录update和delete 语句,而不记录insert语句。另外,所有对象的撤销数据一般保留几小时或几天,而闪回数据 归档中的行可以保留几年甚至几十年。闪回数据归档的关注点也窄得多,只记录对表行的历史 变更。Oracle使用撤销表空间中的数据是为了长期运行事务中的读一致性,以及为了回滚未提交的事务。
访问闪回数据归档中的数据可以如同使用闪回査询一样:在select语句中使用as of子句。 下面几小节将介绍如何创建闪回数据归档、为用户和对象分配权限、查询闪回数据归档中的历史数据。
1.1.1.1 创建归档区
虽然可以在现有表空间中使用create flashback
archive命令创建一个或多个Flashback Data
Archives,但是,Oracle最佳实践建议使用专门的表空间。所有归档区必须使用retention子句 指定默认的保留期限,也可以用default关键字将归档区标识为默认归档区,后者是可选的。 归档区中的磁盘限额受表空间中的磁盘空间限制,除非使用quota关键字在归档区中分配最大的磁盘空间量。
在此示例中,首先为闪回数据归档(Flashback
Data Archive)创建专门的表空间:
create tablespace fbdal datafile '+data' size 10g;
接卜来创建3个闪回数据归档:一个归档区用于ES部门,没有限制磁盘限额,保留期限 是10年;第二个归档区用于财务部门,磁盘限额限制为500MB,保留期限是7年;第三个归 档区是默认归档区,它用于USERS4表空间中的所有其他用户,磁盘限额限制为250MB,保留期限是2年:
create flashback archive fb_es tablespace fbdal
retention 10 year;
create flashback archive fb_fi tablespace fbdal quota 500m retention 7 year;
create flashback archive default tablespace users4
quota 250m retention 2 year;
不能在create flashback archive命令中指定多个表空间,稍后在“管理闪回数据归档"小节中会讲到,必须使用alter flashback archive命令添加表空间。
1.1.1.2 使用闪回数据归档数据字典视图
有两个新的数据字典视图支持闪回数据归档:DBA_FLASHBACK_ARCHIVE
和 DBA_FLASHBACK_ARCHIVE_TS.
DBA_FLASHBACK_ARCHIVE 列出归档区
DBA_FLASHBACK_ARCHIVE_TS 显示表空间到归档区的映射:
DBA_FLASHBACK_ARCHIVE_TABLES 跟踪为闪回归档启用的表。
select flashback_archive_name,
fla8hback_archive#,retention_in_days, status from dba_flashback_archive;
select * from dba_flashback_archive_ts;
1.1.1.3 指定闪回数据归档权限
用户必须有FLASHBACK ARCHIVE ADMINISTER系统权限才能创建或修改闪回数据归档,必须有FLASHBACK ARCHIVE对象权限才能启用对表的跟踪。一旦启用了对表的跟踪, 则用户除需要对表本身的SELECT权限外,不需要任何特定权限就可以在select语句中使用as of子句。
FLASHBACK_ARCHIVE_ADMINSTER权限也包括向归档区添加表空间、从归档区删除表空间、删除归档区以及执行对历史数据的特别清除。
1.1.1.4 管理闪回数据归档
很容易向现有归档区添加另一个表空间,像下面这样使用alter
flashback archive命令将 USERS3表空间添加到FB_DFLT归档区,磁盘限额是400MB。
alter flashback archive fb_dflt add tablespace users3
quota 400m;
使用purge子句可以清除归档区数据,在此例中,想要清除FB_DFLT归档区中2005年1月1日之前的所有行:
alter flashback archive fb_dflt purge before timestamp to_timestamp('2005-01-01 00:00:00', 'YYYY-MM-DD
HH24:MI:SS');
1.1.1.5 为闪回数据归档分配表
为归档区分配表有两种方法:
一种方法是在创建表时使用标准create table语法外加 flashback archive子句来分配;
另一种方法是以后用alter table命令来分配,如下例所示:
alter table hr.employees flashback archive fb_es;
需要注意的是,在上面这个为HR.EMPLOYEES表指定特定归档区的命令中,如果未指定 归档区,则Oracle会分配FB_DFLT.通过査询数据字典视图DBA_FLASHBACK_ARCHIVE_TABLES,可以査看使用闪回数据归档的表:
select * from dba_flashback_archive_tables;
1.1.1.6 查询闪回数据归档
査询闪冋数据归档中表的历史数据与当使用撤销表空间中存储的DML活动时在表中使用 as of子句一样容易。事实上,用户并不会知道他们是从撤销表空间检索历史数据,还是从闪回数据归档检索历史数据。
这一情况与本章前面提到的情况非常相似,HR部门的一个雇员删除了 EMPLOYEES表中 的一个雇员行,且一开始忘记将此行归档到EMPLOYEE_HISTORY表。为EMPLOYEES表启 用闪冋数据归档,则此HR雇员可以依赖FB_ES归档区满足对EMPLOYEE表中已不存在雇员的任何査询。下面是3星期前的delete语句:
delete from employees where enployee_id = 169;
此HR雇员需要找到雇员169的雇佣日期,因此他检索EMPLOYEES表的历史信息,用 as of子句指定时间为4星期前:
select employee_id, last_name, hire_date from
employees
as of timestamp (systimestamp - interval '28' day)
where employee_id = 169;




