Flashback Archive是Oracle 11g推出的具有针对性和强制性的数据透明归档技术。本篇我们集中介绍与该特性相关的权限和DDL操作问题。
9、Flashback Archive相关权限
Oracle一个新特性的推出,经常伴随着一系列新的权限集合的确立。Flashback Archive组件相关的有两个系统权限,分别为flashback archive和flashback archive administrator。
从上面的scott用户的情况中,我们可以看到flashback archive系统权限的作用。就是通过对数据表和已经建立的flashback archive建立关系,开启闪回归档功能。
SQL> conn scott/tiger@ora11g;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> alter table t flashback archive flar1;
alter table t flashback archive flar1
ORA-55620:无权使用闪回归档
--切换到sys用户上
SQL> grant flashback archive on flar1 to scott;
Grant succeeded
SQL> alter table t flashback archive flar1;
Table altered
但是,只拥有flashback archive权限的用户,对视图dba_flashback_xxx系列获取到的结果是不准确的。
SQL> select owner_name, flashback_archive_name from dba_flashback_archive;
OWNER_NAMEFLASHBACK_ARCHIVE_NAME
------------------------------ -------------------------
SQL> select table_name, owner_name from dba_flashback_archive_tables;
TABLE_NAMEOWNER_NAME
-------------------- ------------------------------ --------------------------------
对只拥有flashback archive系统权限的用户而言,只能去查找user_xxx相关视图。
SQL> select owner_name, flashback_archive_name from user_flashback_archive;
OWNER_NAMEFLASHBACK_ARCHIVE_NAME
------------------------------ ------------------------
SYSFLAR1
另一个与flashback archive相关的系统权限是flashback archive administrator,拥有这个权限的用户可以执行下列操作类型:
üCreate flashback archive xxx tablespace yyy quota xx retention zzz;创建闪回归档区,设置空间限制;
üAlter flashback archive xxx进行清理purge等操作;
üDrop flashback archive xxx删除指定的闪回归档空间;
SQL> conn sys/oracle@ora11g as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as SYS
SQL> grant flashback archive administer to scott;
Grant succeeded
SQL> conn scott/tiger@ora11g;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> select * from dba_flashback_archive_tables;
TABLE_NAME OWNER_NAMEFLASHBACK_ARCHIVE_NAME
------------------------------ ------------------------------ -----------------------------------
TSCOTTFLAR1
SQL> create flashback archive flar2 tablespace mytest retention 1 year;
Done
SQL> ALTER FLASHBACK ARCHIVE flar2 PURGE ALL;
Done
SQL> drop flashback archive flar2;
Done
如果取消了这个系统权限,那么相关的系列操作就不能进行。
SQL> revoke flashback archive administer from scott;
Revoke succeeded
SQL> create flashback archive flr2 tablespace mytest retention 1 year;
create flashback archive flr2 tablespace mytest retention 1 year
ORA-55612:无权管理闪回归档
注意,并不是只有显示拥有flashback archive administrator权限的用户才能Create/alter/drop archive flashback操作。如果用户是dba角色,也可以实现这个目标。
SQL> conn sys/oracle@ora11g as sysdba;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as SYS
SQL> grant dba to scott;
Grant succeeded
SQL> conn scott/tiger@ora11g ;
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as scott
SQL> create flashback archive flr2 tablespace mytest retention 1 year;
Done
10、flashback archive与DDL操作
Flashback Archive是保证对数据表进行DML操作时,数据前后镜像都能保存找回的技术。那么,如果一个数据表加入flashback archive之后,进行DDL操作有什么影响呢?我们分别进行试验。
ü数据列添加add实验
对已经加入flashback archive的数据表添加一个数据列。
SQL> alter table t add m varchar2(10);
Table altered
直观感觉没有什么区别,就是添加数据列的速度要慢很多。此时,我们检查相关的数据表。
SQL> select * from sys_fba_ddl_colmap_88294;
STARTSCNENDSCN XIDOPERATION COLUMN_NAMETYPEHISTORICAL_COLUMN_NAME
---------- ---------- ----- --------- -------------- -------------------- --------------------
13395717OWNERVARCHAR2(30)OWNER
(篇幅原因,有省略……)
13395717EDITION_NAMEVARCHAR2(30)EDITION_NAME
13424840MVARCHAR2(10)M
16 rows selected
数据表基表sys_fba_ddl_colmap_88294记录了数据字段变化起效的时间范围(也就是scn范围)。从刚才添加数据列的情况看,数据表中说明从scn=13424840开始,添加起效了数据列m。
ü数据列修改
修改一个数据列属性。
SQL> alter table t modify m varchar2(20) ;
Table altered
SQL> select * from sys_fba_ddl_colmap_88294;
STARTSCNENDSCNCOLUMN_NAMETYPEHISTORICAL_COLUMN_NAME
---------- --------------------------- ---------------- ----------------------
13395717OWNERVARCHAR2(30)OWNER
13395717EDITION_NAMEVARCHAR2(30)EDITION_NAME
1342484013427266 M_13427266_MVARCHAR2(10)M
13427266MVARCHAR2(20)M
17 rows selected
对于一个数据列修改,Oracle flashback archive将其视为删除列后重新添加。
üTruncate table
数据表的truncate操作是一个典型的DDL操作,具有flashback archive特性的数据表是否可以truncate操作呢?
SQL> truncate table t;
Table truncated
SQL> select count(*) from t as of timestamp to_timestamp('2011/9/6 10:45:49','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
17
ü删除数据列
对一个数据列进行删除操作,flashback archive数据表同样支持。
SQL> alter table t drop column m;
Table altered
SQL> select count(*) from t as of timestamp to_timestamp('2011/9/6 10:45:49','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
17
SQL> select count(*) from t;
COUNT(*)
----------
0
此时,在sys_fba_ddl_colmap_88294中会记录上删除记录。
SQL> select STARTSCN,ENDSCN,COLUMN_NAME from sys_fba_ddl_colmap_88294;
STARTSCNENDSCNCOLUMN_NAME
---------- ---------- ---------------- -
13395717OWNER
13395717NAMESPACE
(篇幅原因,有省略。。。。。。)
13395717EDITION_NAME
1342484013427266M_13427266_M
1342726613428271D_13428271_M
17 rows selected
üDrop删除数据表
对drop数据表操作,flashback archive数据表是不支持的。
SQL> drop table t;
drop table t
ORA-55610:针对历史记录跟踪表的DDL语句无效
要想删除数据表,则需要首先使用alter table xxx no flashback archive;语句进行历史数据归档跟踪关系的解除。之后才能进行删除。
11、结论
数据归档、offline是很多系统都需要有的特定需求。我们经常遇到这样的需求:将历史数据保留几个月或者几年待查。待查的情景是很少,但是我们如果从应用入手,就需要设计额外的数据表和业务处理流程。其中一个更麻烦的就是保留期过删数据的操作,相对较为复杂。
Flashback archive是Oracle可以使用在生产系统中直接使用的归档功能组件。如果开发设计使用这个组件进行归档,有若干个好处。
首先是透明化的归档操作,用户不需要去关心进行归档的业务逻辑。只要设置好了需要归档的数据表,按照查询归档语法进行查找。就可以实现应用系统中最典型的归档查询需要。
其次是高效存储个性。在flashback archive中,数据是保存在内部分区压缩表中,各方面的属性由Oracle进行控制管理。
最后是保留期管理严格化。设置不同的flashback archive retention period,首先可以对不同的数据表适应使用不同的保留期。当数据超期之后,Oracle自动进行数据删除工作,不需要用户进行干预。