1. 什么是flashback data archive
Flashback data archive是oracle 11g中引入的一个新特性。Flashback archive是一个新的数据库对象,用于存储一个或多表的历史数据。Flashback archive是一个逻辑对象,概念上类似于表空间。实际上flashback archive可以看作是存储一个或多个表的所有事务变化的逻辑空间。
2. flashback data archive的实现原理
从9i开始,Oracle就提供了表的flashback query功能,使用户可以查询表上过去某一时刻的数据或一段时间内数据的变化情况。flashback query实际上是利用UNDO信息来获得过去的数据。由于UNDO空间是循环使用的,事务的前映像不可能永久保存,因此flashback query只能支持过去一段时间内的数据查询,这个时间与UNDO_RETENTION相关。
Flashback data archive相比flashback query则更进了一步。Flashback data archive不再直接使用UNDO信息获得历史数据,而是把历史数据保存在一个track table里。Oracle新增加了一个后台进程fbda,此进程每隔一段时间(通常是5分钟)把UNDO中的历史数据信息加到track table里。如果表上开启了flashback archive功能,则Oracle先给事务产生的UNDO信息做标记,直到被标记的UNDO信息加到track table后,此UNDO空间才能被重用。
Flashback data archive采用压缩方式存储历史数据,以减小空间占用。同时flashback data archive采用range分区方式对track table表进行分区。track table表上没有索引,用户可根据需要对track table增加索引。
3. 创建flashback data archive
3.1 创建flashback data archive需要的权限
创建flashback data archive需要DBA权限或flashback archive administer权限
开启表的flashback archive logging需要flashback archive对象权限
3.2 创建基本步骤
++ 创建表空间
SQL> create tablespace flash_archive datafile '/oradata/cmsdb11g/flash_archive01.dbf' size 10M autoextend on extent management local uniform size 1M segment space management auto;
Tablespace created.
++ 创建flashback archive管理用户 (需要授予用户flashback archive administer权限)
SQL> create user flashadm identified by flashadm default tablespace flash_archive temporary tablespace temp quota unlimited on flash_archive;
User created.
SQL> grant create session to flashadm;
Grant succeeded.
SQL> grant flashback archive administer to flashadm;
Grant succeeded.
++ 创建flashback archive
SQL> conn flashadm/flashadm
Connected.
SQL> create flashback archive flash1 tablespace flash_archive quota 2000m retention 3 day;
create flashback archive flash1 tablespace flash_archive quota 2000m retention 3 day
*
ERROR at line 1:
ORA-55612: No privilege to manage Flashback Archive
如果用户没有flashback archive administer权限,则报错ORA-55612
SQL> create flashback archive flash1 tablespace flash_archive quota 2000m retention 3 day;
Flashback archive created
创建flashback archive时可以指定表空间上的quota和flashback archive的retention. 如果不指定表空间上的quota,缺省为unlimited.
SQL> select OWNER_NAME,FLASHBACK_ARCHIVE_NAME,FLASHBACK_ARCHIVE#,RETENTION_IN_DAYS,STATUS from dba_flashback_archive;
OWNER_NAME FLASHBACK_ARCHIVE_NA FLASHBACK_ARCHIVE# RETENTION_IN_DAYS STATUS
----------------- -------------------------------- ---------------------------- -------------------------- ----------
FLASHADM FLASH1 1 3
dba_flashback_archive存储flashback archive信息,而在dba_objects中找不到flashback archive信息。如果不是系统的default flashback archive, 则status为空。
SQL> select * from dba_flashback_archive_ts;
FLASHBACK_ARCHIVE_NA FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
-------------------------------- ---------------------------- ----------------------- ------------------
FLASH1 1 FLASH_ARCHIVE 2000
dba_flashback_archive_ts存储flashback archive与表空间对应信息。
++ 开启表的flashback archive logging (需要授予用户flashback archive对象权限)
SQL> conn scott/tiger
Connected.
SQL> alter table emp flashback archive flash1;
alter table emp flashback archive flash1
*
ERROR at line 1:
ORA-55620: No privilege to use Flashback Archive
未授权报错ORA-55620
另开一个会话进行授权:
SQL> grant flashback archive on flash1 to scott;
Grant succeeded.
回到原会话:
SQL> alter table emp flashback archive flash1;
Table altered.
SQL> select * from user_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NA ARCHIVE_TABLE_NAME STATUS
---------------- ----------------- -------------------------------- ----------------------------- ----------
EMP SCOTT FLASH1 SYS_FBA_HIST_13008 ENABLED
user/dba_flashback_archive_tables记录了表、flashback archive及track table的对应信息。