Oracle 11g 閃回資料歸檔

edwardking888發表於2010-04-13

雖然ORA-01555錯誤可以通過種種手段來避免和減少,但是隨著時間的流逝,這些UNDO資訊總會失去,那麼能否將這些資訊儲存起來,使得資料庫在一定的歷史週期之內可以不斷向後追溯,使得我們可以看到一個資料表在任意歷史時間點上的切片呢?

從Oracle Database 11g開始,Oracle 提供了一個這樣的功能:閃回資料歸檔(Flashback Data Archive)。通過這一功能Oracle資料庫可以將UNDO資料進行歸檔,從而提供全面的歷史資料查詢,也因此Oracle引入一個新的概念Oracle Total Recall也即Oracle全面回憶功能。閃回資料歸檔可以和我們一直熟悉的日誌歸檔類比,日誌歸檔記錄的是Redo的歷史狀態,用於保證恢復的連續性;而閃迴歸檔記錄的是UNDO的歷史狀態,可以用於對資料進行閃回追溯查詢;後臺程式LGWR用於將Redo資訊寫出到日誌檔案,ARCH程式負責進行日誌歸檔;在Oracle 11g中,新增的後臺程式FBDA(Flashback Data Archiver Process)則用於對閃回資料進行歸檔寫出:

[oracle@sp3: ~]$ps -ef | grep fbda | grep -v grep
oracle    3251     1  0 Jan07 ?        00:00:11 ora_fbda_ccdb

閃迴歸檔資料甚至可以以年為單位進行儲存,Oracle可以通過內部分割槽和壓縮演算法減少空間耗用,這一特性對於需要審計以及歷史資料分割槽的環境尤其有用,但是注意,對於繁忙的資料庫環境,閃回資料儲存顯然要耗用更多的儲存空間。當然,使用者可以根據需要,對部分表進行閃回資料歸檔,從而滿足特定的業務需求。

因為閃回資料歸檔需要獨立的儲存,所以在使用該特性之前需要建立獨立的ASSM(自動段空間管理)表空間:

sys@TQGZS11G> create tablespace fbda datafile '/oracle/oradata/tqgzs11g/FBDA.dbf' size 200M segment space management auto;
Tablespace created.

然後可以基於該表空間建立閃回資料歸檔區,FLASHBACK ARCHIVE ADMINISTER系統許可權是建立閃回資料存檔所必需的,此處使用SYS使用者進行:

sys@TQGZS11G> create flashback archive fda tablespace fbda retention 1 month;
Flashback archive created.

此後就可以使用該歸檔區來記錄資料表的閃回資料量。為了測試方便,先將UNDO表空間更改為較小,以使得UNDO資料能夠儘快老化:

sys@TQGZS11G> create undo tablespace UNDOTBS2_SMALL datafile '/oracle/oradata/tqgzs11g/UNDOTBS2_SMALL.dbf' size 20M autoextend off;
Tablespace created.
sys@TQGZS11G> alter system set undo_tablespace= UNDOTBS2_SMALL;
System altered.
sys@TQGZS11G> show parameter undo
NAME                                 TYPE                           VALUE
------------------------------------ ------------------------------ ------------------------------
undo_management                      string                         AUTO
undo_retention                       integer                        900
undo_tablespace                      string                         UNDOTBS2_SMALL

接下來使用測試使用者連線,對測試表執行閃迴歸檔設定,FLASHBACK ARCHIVE物件許可權是啟用歷史資料跟蹤所必需的:

sys@TQGZS11G> conn tq/tq
Connected.
tq@TQGZS11G> select TABLE_NAME from user_tables;
TABLE_NAME
--------------------
T
EMP
tq@TQGZS11G> alter table t flashback archive fda;
Table altered.

取消對於資料表的閃迴歸檔可以使用如下命令:

alter table table_name no flashback archive;

接下來記錄一下SCN,從資料庫表中刪除部分資料:

tq@TQGZS11G> select dbms_flashback.get_system_change_number from dual;  
GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1142115
tq@TQGZS11G> select count(*) from t;
  COUNT(*)
----------
     69266
tq@TQGZS11G> delete from t where rownum < 1001;
1000 rows deleted.
tq@TQGZS11G> commit;
Commit complete.

現在執行閃回查詢,則資料來自UNDO表空間:

tq@TQGZS11G> select count(*) from t as of scn 1142115;
  COUNT(*)
----------
     69266
Execution Plan
----------------------------------------------------------
Plan hash value: 2966233522
-------------------------------------------------------------------
| Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
-------------------------------------------------------------------
|   0 | SELECT STATEMENT   |      |     1 |  1048   (1)| 00:00:13 |
|   1 |  SORT AGGREGATE    |      |     1 |            |          |
|   2 |   TABLE ACCESS FULL| T    | 69266 |  1048   (1)| 00:00:13 |
-------------------------------------------------------------------

接下來執行一小段批量迴圈程式碼,使UNDO資料老化覆蓋:

tq@TQGZS11G> begin
  2  for i in 1 .. 100 loop
  3  delete from t where rownum < 31;
  4  commit;
  5  end loop;
  6  end;
  7  /
PL/SQL procedure successfully completed.

現在來看一下閃回資料歸檔發揮作用的閃回查詢,通過執行計劃能夠看到和之前查詢執行方式的不同:

tq@TQGZS11G> select count(*) from t as of scn 1142115;
  COUNT(*)
----------
     69266
Execution Plan
----------------------------------------------------------
Plan hash value: 1421074822
----------------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name               | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                    |     1 |       |  1151   (1)| 00:00:14 |       |       |
|   1 |  SORT AGGREGATE           |                    |     1 |       |            |          |       |       |
|   2 |   VIEW                    |                    | 20633 |       |  1151   (1)| 00:00:14 |       |       |
|   3 |    UNION-ALL              |                    |       |       |            |          |       |       |
|   4 |     PARTITION RANGE SINGLE|                    | 20295 |   515K|    69   (2)| 00:00:01 |     1 |     1 |
|*  5 |      TABLE ACCESS FULL    | SYS_FBA_HIST_72661 | 20295 |   515K|    69   (2)| 00:00:01 |     1 |     1 |
|*  6 |     FILTER                |                    |       |       |            |          |       |       |
|*  7 |      HASH JOIN OUTER      |                    |   338 |   669K|  1081   (1)| 00:00:13 |       |       |
|*  8 |       TABLE ACCESS FULL   | T                  |  3463 | 41556 |  1048   (1)| 00:00:13 |       |       |
|   9 |       VIEW                |                    | 19522 |    37M|    32   (0)| 00:00:01 |       |       |
|* 10 |        TABLE ACCESS FULL  | SYS_FBA_TCRV_72661 | 19522 |    37M|    32   (0)| 00:00:01 |       |       |
----------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   5 - filter("ENDSCN">1142115 AND "ENDSCN"<=1145328 AND ("STARTSCN" IS NULL OR "STARTSCN"<=1142115))
   6 - filter("F"."STARTSCN"<=1142115 OR "F"."STARTSCN" IS NULL)
   7 - access("T".ROWID=CHARTOROWID("F"."RID"(+)))
   8 - filter("T"."VERSIONS_STARTSCN" IS NULL)
  10 - filter(("ENDSCN" IS NULL OR "ENDSCN">1145328) AND ("STARTSCN" IS NULL OR "STARTSCN"<1145328))
Note
-----
   - dynamic sampling used for this statement

通過以上執行計劃可以看到,查詢閃回來自SYS_FBA_TCRV_72661系統表,該表隸屬於閃迴歸檔表空間,用於記錄閃回資料:

tq@TQGZS11G> desc SYS_FBA_TCRV_72661
Name              Null?    Type
----------------- -------- ---------------------
RID                        VARCHAR2(4000)
STARTSCN                   NUMBER
ENDSCN                     NUMBER
XID                        RAW(8)
OP                         VARCHAR2(1)
tq@TQGZS11G> select count(*) from SYS_FBA_TCRV_72661;
  COUNT(*)
----------
     18511

閃回功能生成的字典物件有多個,通過查詢USER_TABLES/USER_OBJECTS檢視可以獲得這些物件的詳細資訊:

tq@TQGZS11G> select table_name,tablespace_name from user_tables where table_name like '%FBA%';
TABLE_NAME                     TABLESPACE_NAME
------------------------------ --------------------
SYS_FBA_DDL_COLMAP_72661       FBDA
SYS_FBA_TCRV_72661             FBDA
SYS_FBA_HIST_72661
tq@TQGZS11G> select object_name,object_type from user_objects where object_name like '%FBA%';
OBJECT_NAME                    OBJECT_TYPE
------------------------------ --------------------
SYS_FBA_DDL_COLMAP_72661       TABLE
SYS_FBA_HIST_72661             TABLE
SYS_FBA_HIST_72661             TABLE PARTITION
SYS_FBA_TCRV_72661             TABLE
SYS_FBA_TCRV_IDX_72661         INDEX

可以通過資料字典檢視來檢視關於閃迴歸檔表的記錄:

tq@TQGZS11G> select * from user_flashback_archive_tables;                                   
TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME         ARCHIVE_TABLE_NAME
---------- ---------- ------------------------------ --------------------
T          TQ         FDA                            SYS_FBA_HIST_72661

可以通過dict字典查詢和閃迴歸檔有關的資料字典表:

sys@TQGZS11G> select table_name from dict where table_name like '%FLASHBACK_ARCHIVE%';
TABLE_NAME
-----------------------------------
DBA_FLASHBACK_ARCHIVE
DBA_FLASHBACK_ARCHIVE_TABLES
DBA_FLASHBACK_ARCHIVE_TS
USER_FLASHBACK_ARCHIVE
USER_FLASHBACK_ARCHIVE_TABLES

總之,閃回資料歸檔是Oracle 11g提供的重要增強之一,通過合理使用這一增強,可以為資料庫提供更為全面的資料生命週期管理,Oracle關於UNDO技術的進化至此又邁進了重要的一步。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8183550/viewspace-659570/,如需轉載,請註明出處,否則將追究法律責任。

相關文章