技术分享
闪回数据归档(Flashback Data Archive)
2020-08-05
14.2 闪回数据归档(Flashback Data Archive)(1)
闪回查询对撤销数据及参数undo_retention的依赖注定了它们在大事务量的情况下闪回时间窗口将会很小,想要查询数月之前的"旧"数据绝对不可能,但在闪回数据归档面前这并不是不可能的。
闪回数据归档的工作原理是将原本只能保存在UNDO表空间的撤销数据额外的以一种历史表的形式保存在指定的普通表空间(permanent类型的表空间)中。并且不像undo_retention参数那样是个影响整个数据库的设置,闪回数据归档可以只为特定的表服务,这样就可以长时间地保存感兴趣的"旧"数据了。比如,在USERS表空间中创建一个能够将"旧"数据保存1年的数据归档,取名为"FDA1",操作者必须拥有"flashback archive administer"系统权限:
SQL> create flashback archive fda1 tablespace users retention 1 year;
Flashback archive created.
SQL> create flashback archive default fda_default tablespace users retention 1 year;
Flashback archive created.
SQL> alter table hr.employees flashback archive fda1;
Table altered.
SQL> grant flashback archive on fda1 to hr;
Grant succeeded.
SQL> alter table hr.departments flashback archive;
Table altered.
在创建新表时也能指定所使用的闪回数据归档:
SQL> create table oe.inventory
2 (id number,product_id number,supplier_id number) flashback archive fda1;
Table created.
SQL> alter table oe.inventory no flashback archive;
Table altered.
SQL> select * from hr.employees
2 as of timestamp (systimestamp - interval '7' month);
以hr.employees基表为例,使用以下查询能够一睹闪回归档的主要信息:
SQL> select
2 a.flashback_archive_name fda_name,a.retention_in_days days,
3 ts.tablespace_name ts,ts.quota_in_mb,
4 t.archive_table_name
5 from
6 dba_flashback_archive a,
7 dba_flashback_archive_ts ts,
8 dba_flashback_archive_tables t
9 where
10 a.flashback_archive_name = ts.flashback_archive_name and
11 a.flashback_archive_name = t.flashback_archive_name and
12 t.owner_name = 'HR' and
13 t.table_name = 'EMPLOYEES';
FDA_NAME DAYS TS QUOTA_IN_M ARCHIVE_TABLE_NAME
---------- ---------- ------- ---------- --------------------
FDA1 365 USERS SYS_FBA_HIST_73953
14.2 闪回数据归档(Flashback Data Archive)(2)
其中ARCHIVE_TABLE_NAME字段的值就是归档中历史表的名字--SYS_FBA_ HIST_73953,该表不能直接查询,更不用提其他操作了。
此外结果中还显示了配额的大小(QUOTA_IN_MB)为空,即没有配额限制。管理员在创建闪回归档时实际上可以为其设置能够占用的磁盘空间上限,即所谓的配额。比如创建归档fda2时限制其空间限制为40GB:
SQL> create flashback archive fda2 tablespace users quota 40G retention 2 year;
Flashback archive created.
SQL> alter flashback archive fda
2 purge before timestamp (systimestamp - interval '1' month);
Flashback archive altered.
SQL> alter flashback archive fda purge all;
Flashback archive altered.
启用了闪回数据归档功能的表依然支持绝大多数的ddl命令。但在执行少数ddl命令时会遭遇"ORA-55610: Invalid DDL statement on history-tracked table"错误,比如"alter table … shrink space"、"alter table … move"、"alter table … exchange partition"等。接下来以"alter table … exchange partition"举例说明。以下分别是一张分区表和一张堆栈表的ddl定义:
分区表(范围类分区--By Range):
SQL> create table hr.rpt (id number,name varchar2(30))
2 partition by range (id)
3 (
4 partition p1 values less than (100) tablespace users,
5 partition p2 values less than (200) tablespace users,
6 partition p3 values less than (maxvalue) tablespace users
7 );
Table created.
SQL> create table hr.source (id number, name varchar2(30)) tablespace users;
Table created.
SQL> alter table hr.rpt exchange partition p3 with table hr.source;
Table altered.
SQL> alter table hr.rpt flashback archive fda1;
Table altered.
SQL> alter table hr.rpt exchange partition p3 with table hr.source;
alter table hr.rpt exchange partition p3 with table hr.source
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
SQL> select archive_table_name from dba_flashback_archive_tables
2 where owner_name='HR' and table_name='RPT';
ARCHIVE_TABLE_NAME
-----------------------------------------------------
SYS_FBA_HIST_74619
14.2 闪回数据归档(Flashback Data Archive)(3)
然后使用dbms_flashback_archive的disassiociate_fba过程将RPT表与其历史表(SYS_FBA_HIST_74619)切断联系,这样才能在这两张表上执行所有的ddl命令,并且,如果管理员愿意,还能在历史表上执行dml命令:
SQL> exec dbms_flashback_archive.disassociate_fba('HR','RPT');
PL/SQL procedure successfully completed.
SQL> alter table hr.rpt exchange partition p3 with table hr.source;
Table altered.
SQL> exec dbms_flashback_archive.reassociate_fba('HR','RPT');
PL/SQL procedure successfully completed.

- 标签:
-
技术分享