11g闪回数据归档
=================
闪回数据归档是用来保存一个或多个表的历史数据的新数据库对象、以及该数据的存储保留和清除策略
归档保留数据库中表的变化
并将这些变化保存在表空间中
这些变化数据是压缩存储的,并且只保留过去的变化
所以插入操作时不会记录在变化中的
为了实现闪回数据归档,oracle使用后台进程FBDA(flashback data archive proces)来定期将undo中捕获的变化写入闪回数据归档中
FBDA进程默认5分钟捕获一次表的归档变化数据
不过如果系统特别繁忙,这个频率也会加快
数据库默认的堆表并不开启闪回数据归档
所以要使用这个功能必须在创建表的时候添加 falshback data archive关键字或者使用alter table命令启用表的归档
数据库中可以对多个表使用闪回归档
这些归档数据可以在同一个表空间也可以在不同的表空间
同一个数据库中可以有多个闪回数据归档
对于不同的闪回数据归档采用不同的策略,如一个数据自动保留5年,一个数据自动保留2年
对于开启闪回数据归档的表不能直接删除,要先关闭闪回数据归档后才能删除
----------------
--创建闪回数据归档需要的权限
FLASHBACK ANY TABLE
FLASHBACK ARCHIVE ADMINISTER
----------------
--测试
--测试环境版本
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production
--创建存放闪回数据归档的表空间flash_data1和flash_data2
SQL> create tablespace flash_data1 datafile '/oracle/oradata/db11/db11/flash001.dbf' size 10m autoextend on maxsize 4096m;
Tablespace created.
SQL> create tablespace flash_data2 datafile '/oracle/oradata/db11/db11/flash0021.dbf' size 10m autoextend on maxsize 4096m;
Tablespace created.
--创建闪回归档flash_1y
--分配默认表空间flash_data1
--默认表空间中分配4000m的空间权限
--闪回归档数据保存1年
SQL> create flashback archive flash_1y
2 tablespace flash_data1
3 quota 4000m
4 retention 1 year;
Flashback archive created.
--对闪回数据归档的操作
--设置系统默认归档
SQL> alter flashback archive flash_1y set default;
Flashback archive altered.
--为闪回数据归档添加表空间
SQL> alter flashback archive flash_1y add tablespace flash_data2;
Flashback archive altered.
--调整闪回归档数据对应表空间的使用空间数
SQL> alter flashback archive flash_1y modify tablespace flash_data2 quota 10m;
Flashback archive altered.
--调整闪回归档数据保留的时间,到时间自动删除过期数据
SQL> alter flashback archive flash_1y modify retention 2 year;
Flashback archive altered.
SQL> alter flashback archive flash_1y modify retention 1 year;
Flashback archive altered.
--删除闪回归档数据与对应表空间的联系
--删除后表空间仍然存在
SQL> alter flashback archive flash_1y remove tablespace flash_data2;
Flashback archive altered.
--清除闪回数据归档中所有的变化数据
SQL> alter flashback archive flash_1y purge all;
Flashback archive altered.
--清除特定时间前的数据
SQL> alter flashback archive flash_1y purge before timestamp(systimestamp-interval '2' day);
Flashback archive altered.
--时间还可以使用如下值:
systimestamp - interval '2' second
systimestamp - interval '2' day
systimestamp - interval '2' month
--清除特定scn之前的数据
SQL> select dbms_flashback.get_system_change_number from dual;
GET_SYSTEM_CHANGE_NUMBER
------------------------
905328
SQL> alter flashback archive flash_1y purge before scn 905328;
Flashback archive altered.
--创建测试用户
SQL> create user an identified by an;
User created.
--授予权限
SQL> grant connect,resource to an;
Grant succeeded.
SQL> grant flashback any table to an;
Grant succeeded.
SQL> grant flashback archive administer to an;
Grant succeeded.
--创建闪回数据归档的表
--建表时带有关键字 flashback archive
--并且指定使用的闪回数据归档
SQL> conn an/an
Connected.
SQL> create table atest(id int,
2 name varchar2(10),
3 address varchar2(20))
4 flashback archive flash_1y;
Table created.
--关闭表的闪回数据归档特性
SQL> alter table atest no flashback archive;
Table altered.
--重新开启表的闪回数据归档
SQL> alter table atest flashback archive;
Table altered.
--创建测试数据
SQL> insert into atest select 1,'an','home1' from dual;
1 row created.
SQL> insert into atest select 2,'xiangxiang','home1' from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> select * from atest;
ID NAME ADDRESS
---------- ---------- --------------------
1 an home1
2 xiangxiang home1
----------------------------
--和闪回数据归档相关的字典表
--其中比较常用的是前三个
--分别对应系统中的闪回数据归档、已经开启闪回数据归档的表以及闪回归档数据存放的表空间
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
DBA_FLASHBACK_TXN_REPORT
DBA_FLASHBACK_TXN_STATE
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES
USER_FLASHBACK_TXN_REPORT
USER_FLASHBACK_TXN_STATE
--这个字典表描述闪回数据归档对应的表名、owner、使用的闪回数据归档名、记录表变化情况的日志表名以及状态
SQL> desc user_flashback_archive_tables
Name Null? Type
----------------------------------------- -------- ----------------------------
TABLE_NAME NOT NULL VARCHAR2(30)
OWNER_NAME NOT NULL VARCHAR2(30)
FLASHBACK_ARCHIVE_NAME NOT NULL VARCHAR2(255)
ARCHIVE_TABLE_NAME VARCHAR2(53)
STATUS VARCHAR2(8)
SQL> col FLASHBACK_ARCHIVE_NAME for a15
SQL> col ARCHIVE_TABLE_NAME for a20
SQL> col table_name for a15
SQL> col owner_name for a15
SQL> set linesize 300
SQL> set wrap off
--如下查询限制表an.atest使用了flash_1y这个闪回数据归档
--目前表闪回数据归档的状态为开启
--记录表变化情况的日志表为SYS_FBA_HIST_73424
--进程FBDA不是实时,所以修改完表后过几分钟日志表的数据才会更新
SQL> select * from user_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME STATUS
--------------- --------------- --------------- -------------------- --------
ATEST AN FLASH_1Y SYS_FBA_HIST_73424 ENABLED
SQL> conn / as sysdba
Connected.
SQL> select * from USER_FLASHBACK_ARCHIVE;
no rows selected
SQL> select * from dba_flashback_archive;
OWNER_NAME FLASHBACK_ARCHI FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS
--------------- --------------- ------------------ ----------------- ----------------------------------------- ------------------------------------------
SYS FLASH_1Y 1 365 14-NOV-11 03.22.21.000000000 PM 14-NOV-11 03.33.21.000000000 PM DEFAULT
SQL> select * from dba_flashback_archive_ts;
FLASHBACK_ARCHI FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB
--------------- ------------------ ------------------------------ ----------------------------------------
FLASH_1Y 1 FLASH_DATA1 4000
--对表中数据进行更改
Connected.
SQL> update atest set id=id+1;
2 rows updated.
SQL> commit;
Commit complete.
SQL> select * from atest;
ID NAME ADDRESS
---------- ---------- --------------------
2 an home1
3 xiangxiang home1
SQL> update atest set id=1 where id=3;
1 row updated.
SQL> commit;
SQL> select * from atest;
ID NAME ADDRESS
---------- ---------- --------------------
2 an home1
1 xiangxiang home1
--更改后记录更改的表中并不是马上添加数据
--因为fbda进程滞后
--要过一段时间时候数据才能进行查询
--查询时包括更改数据时的scn、操作数据的类型以及数据的值都会有详细记录
SQL> select current_timestamp from dual;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
14-NOV-11 03.42.44.061854 PM +08:00
SQL> select * from SYS_FBA_HIST_73424;
no rows selected
SQL> select current_timestamp from dual;
CURRENT_TIMESTAMP
---------------------------------------------------------------------------
14-NOV-11 04.00.41.818424 PM +08:00
SQL> select * from SYS_FBA_HIST_73424;
RID STARTSCN ENDSCN XID O ID NAME ADDRESS
---------- ---------- ---------- ---------------- - ---------- ---------- --------------------
AAAR7QAAEA 905464 905799 0200010082020000 I 1 an home1
AAAR7QAAEA 905464 905799 0200010082020000 I 2 xiangxiang home1
AAAR7QAAEA 905799 906194 04000100FD010000 U 3 xiangxiang home1
--查询
--基于时间
SQL> select * from atest as of timestamp to_timestamp('2011-11-14 15:40:00','yyyy-mm-dd hh24:mi:ss');
ID NAME ADDRESS
---------- ---------- --------------------
1 an home1
2 xiangxiang home1
SQL> select * from atest as of timestamp to_timestamp('2011-11-14 16:01:00','yyyy-mm-dd hh24:mi:ss');
ID NAME ADDRESS
---------- ---------- --------------------
1 xiangxiang home1
2 an home1
--基于scn
SQL> select * from atest as of scn 905464;
ID NAME ADDRESS
---------- ---------- --------------------
1 an home1
2 xiangxiang home1
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/13177610/viewspace-710927/
,如需转载,请注明出处,否则将追究法律责任。