11G新特性:FLASHBACK ARCHIVE
闪回数据归档(FLASHBACK ARCHIVE)与UNDO表空间是没有任何关系的,并且与flashback logs(开启数据库闪回生成的日志)也无关。
闪回数据归档需要单独为其创建相应的表空间(falshback tablespace)用于保存对指定表修改的历史数据。
下面演示针对DML操作的闪回查询
创建FLASHBACK ARCHIVE
SQL> create flashback archive default tbs_archive01
2 tablespace tbs_ht02
3 retention 1 day;
Flashback archive created.
查询ligle.t01表数据
SQL> col owner for a10
SQL> col object_name for a20
SQL> col object_type for a20
SQL> select owner,object_id,object_name,object_type from ligle.t01 where owner='SCOTT'
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- --------------------
-------------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
删除一条数据
SQL> delete from t01 where object_id=75334;
1 row deleted.
SQL> commit;
Commit complete.
再次查询ligle.t01表数据
SQL> select owner,object_id,object_name,object_type from ligle.t01 where owner='SCOTT';
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
可以发现OBJECT_ID为75334的数据已被删除。
通过FLASHBACK ARCHIVE查询过去某时刻该表的数据:
SQL> select owner,object_id,object_name,object_type from t01 as of timestamp (systimestamp-interval '10' minute) where owner='SCOTT';
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
6 rows selected.
我们知道,在Oracle 11g以前,通过闪回查询也可以查出过去某时刻的数据状态(该方法的前提是UNDO表空间必须还存在该表被修改时的undo数据,否则将会报ORA-01555),那么比较细心的朋友会发现,在上面的闪回归档查询中是不是也是用的UNDO数据呢?
可以通过切换当前的undo表空间来实验下:
SQL> conn /as sysdba
SQL> create undo tablespace UNDOTBS2 datafile '/soft/oradata/horizon/undotbs02.dbf' size 10M;
SQL> alter system set undo_tablespace='UNDOTBS2';
SQL> conn ligle/ligle
Connected.
SQL> select owner,object_id,object_name,object_type from t01 as of timestamp (systimestamp-interval '20' minute) where owner='SCOTT';
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
至此,可以明白,在当前UNDO表空间已被切换的情况下,依然可以查询到过去某时刻的表数据状态,所以可以证明FLASHBACK ARCHIVE与UNDO表空间是没有关系的。
通过FLASHBACK ARCHIVE恢复表数据到某时刻:
SQL> alter table t01 enable row movement;
Table altered.
SQL> flashback table t01 to timestamp (systimestamp - interval '40' minute);
Flashback complete.
SQL> select owner,object_id,object_name,object_type from t01 where owner='SCOTT';
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
SCOTT 75334 PK_DEPT INDEX
6 rows selected.
通过创建FLASHBACK ARCHIVE表空间来存储指定表的变更历史数据,避免了对UNDO表空间的过度依赖。
[@more@]
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25834554/viewspace-1056794/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25834554/viewspace-1056794/