閃回之 Flashback Data Archive


背景:
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.



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM