背景:
Oracle 11g 中 Flashback Data Archive 特性。將變化數據另外存儲到創建的閃回歸檔區(Flashback Archive)中,以和 undo 區別開來,這樣就可以為閃回歸檔區單獨設置存儲策略,使之可以閃回到指定時間之前的舊數據而不影響 undo 策略。並且可以根據需要指定哪些數據庫對象需要保存歷史變化數據,而不是將數據庫中所有對象的變化數據都保存下來,而只是記錄了指定表的數據變化。所以,Flashback Data Archive 是針對對象的保護,是 Flashback Database 的有力補充。
閃回數據歸檔區:
閃回數據歸檔區是閃回數據歸檔的歷史數據存儲區域,每一個閃回數據歸檔區都可以有一個唯一的名稱,對應了一定的數據保留策略。
在一個系統中,可以有一個默認的閃回數據歸檔區,也可以創建其他許多的閃回數據歸檔區域。
Flashback archive 的限制條件:
1)Flashback data archive 只能在 ASSM 的 tablespace 上創建
2)Flashback data archive 要求必須使用自動 undo 管理,即 undo_management 參數為 auto
Flashback archive 的后台進程:
Oracle11g 為 Flashback data archive 特性專門引入了一個新的后台進程FBDA,用於將追蹤表(traced table,也就是將指定使用 flashback data archive 的table)的歷史變化數據轉存到閃回歸檔區。
-- 查看 FDBA 進程
SQL> select name,description from v$bgprocess where name='FBDA';
NAME DESCRIPTION
----- -----------------------------------------------------------
FBDA Flashback Data Archiver Process
FDA 管理操作:
--創建一個默認的 Flashback Archive, 配額為 10M,數據保留期為 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--創建一個默認的 Flashback Archive,配額 unlimited,數據保留期為 7 天
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;
(配額 unlimited,用戶對該表空間的配額也必須為 ulimited)
若配合不夠,則修改用戶配額。 -> SQL> grant unlimited tablespace to XXXX;
--用戶賦權
SQL> grant flashback archive administer to andy;
--查詢 flashback archive 情況
SQL> select flashback_archive_name name, status from dba_flashback_archive;
--修改default flashback archive
SQL> alter flashback archive XXX set default;
--為已經存在的 Flashback Archive 添加表空間,並指定配額
SQL> alter flashback archive XXX add tablespace XXXX quota 100M;
--將表空間從 Flashback Archive 中移除
SQL> alter flashback archive XXX remove tablespace XXX;
--修改已經存在的 Flashback Archive 的配額
SQL> alter flashback archive fla1 modify tablespace XXX quota 30m;
--修改配額不受限制
SQL> alter flashback archive XXX modify tablespace XXX;
--修改 Flashback Archive 的 retention time
SQL> alter flashback archive fla1 modify retention 1 year;
--清空 Flashback Archive 中的所有歷史記錄
SQL> alter flashback archive XXX purge all;
--清空 Flashback Archive 中超過 1 天的歷史數據
SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1'day);
--清空 Flashback Archive 中指定 SCN 之前的所有歷史數據
SQL> alter flashback archive fla1 purge before scn XXX;
-- 刪除 Flashback Archive 不會刪除相應的表空間
SQL> DROP FLASHBACK ARCHIVE XXX;
操作流程:
--創建測試的 FDA 表空間
SQL>
create tablespace fda01 logging datafile '/home/oracle/app/oradata/orcl/fda01.dbf'
size 10m autoextend on next 1m maxsize 30m extent management local;
SQL>
create tablespace fda02 logging datafile '/home/oracle/app/oradata/orcl/fda02.dbf'
size 10m autoextend on next 1m maxsize 30m extent management local;
--創建一個默認的 Flashback Archive, 配額為 10M,數據保留期為 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--創建一個默認的 Flashback Archive,配額 unlimited,數據保留期為 7 天
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;
--查詢 flashback archive 情況
SQL> col name for a40
SQL> select flashback_archive_name name, status from dba_flashback_archive;
NAME STATUS
---------------------------------------- -------
FDA01 DEFAULT
FDA02
--創建 table,使用默認的 Flashback Data Archive 來存儲歷史數據
SQL> create table fad01(id number) flashback archive;
--創建 table,使用指定的 Flashback Data Archive 來存儲歷史數據
SQL> create table fda02(id number) flashback archive fda02;
在 Flashback Area 中,會有一張歷史表記錄着我們啟動 FA 表的所有操作。 我們可以通過如下 SQL 來查看他們之間的映射關系。
SQL> SELECT table_name,archive_table_name,status from dba_flashback_archive_tables;
--對表啟用 Flashback archive,並使用默認的 Flashback archive。
SQL> alter table XXX flashback archive;
--禁用表的 Flashback Archive
SQL> alter table XXX no flashback archive;
--對 table 啟用 Flashback archive,並指定 Flashaback Archive 區。
SQL> alter table XXX flashback archive fla1;
針對 FDA 的DDL處理。
啟動Flashback Data Archive的表上的一些DDL 操作可能觸發ORA-55610的錯誤,DDL限制:
1)ALTER TABLE statement that includes an UPGRADE TABLE clause, withor without an INCLUDING DATA clause
2)ALTER TABLE statement that moves or exchanges a partition or subpartition operation
3)DROP TABLE statement
說明:
如果必須在已經啟用 Flashback Archive 的表上執行這些不支持的 DDL 操作,可以用DBMS_FLASHBACK_ARCHIVE 包將表從Flashback Data Archive 分離出來,待操作結束后在添加進去。
--查詢 FDA 的映射關系
SQL> SELECT table_name,archive_table_name,status from dba_flashback_archive_tables;
我們要執行那些不支持的 DDL,就需要用 dbms_flashback_archive 禁用他們之間的映射關系,在操作,操作完在用該包啟用他們。
--表的分離和重新結合
SQL> exec dbms_flashback_archive.disassociate_fba('ANDY','FAD01');
SQL> exec dbms_flashback_archive.reassociate_fba('ANDY','FAD01');
Flashback Data Archive 恢復數據的測試流程:
--創建測試的 FDA 表空間
SQL>
create tablespace fda01 logging datafile '/home/oracle/app/oradata/orcl/fda01.dbf'
size 10m autoextend on next 1m maxsize 30m extent management local;
SQL>
create tablespace fda02 logging datafile '/home/oracle/app/oradata/orcl/fda02.dbf'
size 10m autoextend on next 1m maxsize 30m extent management local;
--創建一個默認的 Flashback Archive, 配額為 10M,數據保留期為 7 天
SQL> create flashback archive default fda01 tablespace fda01 quota 10M retention 7 day;
--創建一個默認的 Flashback Archive,配額 unlimited,數據保留期為 7 天
SQL> create flashback archive fda02 tablespace fda02 retention 7 day;
--查詢 flashback archive 情況
SQL> col name for a40
SQL> select flashback_archive_name name, status from dba_flashback_archive;
NAME STATUS
---------------------------------------- -------
FDA01 DEFAULT
FDA02
--sys用戶賦權
SQL> grant flashback archive administer to andy;
--創建測試表:
SQL> create table fad01(id number) flashback archive;
--插入數據:
SQL> insert into fad01 values(1);
SQL> select count(*) from fad01;
COUNT(*)
----------
1
--查詢時間:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2015-03-15 05:35:40
在 update 一次數據:
SQL> update fad01 set id=11 where id =1;
SQL>commit;
查詢時間:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2015-03-15 05:37:25
使用 Flashback Archive 查詢 1 分鍾之前的數據:
SQL> select count(*) from fad01 as of timestamp (systimestamp - interval '1'minute);
COUNT(*)
----------
0
--刪除表數據
SQL> delete from fad01;
SQL> commit;
SQL> select count(*) from fad01;
查詢表映射關系
SQL> col TABLE_NAME for a10
SQL> col OWNER_NAME for a10
SQL> col FLASHBACK_ARCHIVE_NAME for a15
SQL> SELECT * from dba_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME STATUS
---------- ---------- --------------- ---------------------------------- ---------------
FAD01 ANDY FDA01 SYS_FBA_HIST_97516 ENABLED
從這個結果,可以看出,在 Flashback archive 對應的 FAD01 表的歷史表是 SYS_FBA_HIST_97516 。
該表保存了 FA 表的所有的操作記錄:
SQL> select count(*) from SYS_FBA_HIST_97516;
COUNT(*)
----------
2
注意:歷史表只能查詢,若想修改,必須解除映射關系。
______________________________________________
驗證 FDA 與undo無關,新建 UDNO TBS並切換默認 UNDO TBS ,刪除舊默認 UNDO TBS
1、創建新的undo表空間undotbs2
create undo tablespace UNDOTBS2 datafile '/home/oracle/app/oradata/orcl/undotbs02.dbf'
size 50m autoextend on next 10m maxsize unlimited extent management local;
2、切換系統表空間
alter system set undo_tablespace=UNDOTBS2 scope=both;
3、刪除原來undo內容
drop tablespace undotbs1 including contents and datafiles;
______________________________________________
SQL> select * from fad01 as of timestamp to_timestamp('2015-03-15 05:37:25','YYYY-MM-DD hh24:mi:ss');
ID
----------
11
-- 利用不受限於undo時間的,FDA 與 flashback query恢復誤操作。
SQL> insert into fad01 select * from fad01 as of timestamp to_timestamp('2015-03-15 05:37:25','YYYY-MM-DD hh24:mi:ss');
1 row created.
SQL> select * from fad01;
ID
----------
11
-- 刪除 FDA 表
SQL> alter table fad01 no flashback archive;
Table altered.
SQL> drop table fad01;
Table dropped.