Oracle Flashback Archive——Oracle閃迴歸檔(中)

haolinhappy發表於2015-10-08

 

Flashback archiveOracle 11g中推出的新歷史資料查詢新特性。對比過去的flashback queryflashback archive具有更強的時間準確和物件針對性。

 

 

5Flashback Archive元件和FBDA程式

 

Flashback Archive特性是Oracle 11g中新推出的。每個新特性的推出,大都伴隨著Oracle體系結構的不斷豐富和調整。

 

Oracle Total Recall元件是Flashback Archive功能的元件名稱。作為一個獨立元件在Oracle安裝的時候是會進行預設安裝的。從Oracle 官方資料中看,Flashback archive的作用是跟蹤一個或者多個資料錶的歷史history資料變化,將其儲存在一個或者多個表空間中。

 

 

藉助Oracle 11gTotal Recall元件,Oracle會對資料表資料的變化進行自動的跟蹤記錄,記錄在設定的flashback archive裡。這個過程中,Oracle會進行相應的最佳化工作,將歸檔資料進行壓縮、分割槽。這樣做的效果可以在最小影響應用程式DML操作,並且對應用程式透明的情況下將資料進行歸檔儲存。

 

 

為了實現Flashback Archive的功能,Oracle新引入了一個例項程式為FBDAFlashback Archived Process)。該程式啟動時隨著資料庫同時啟動。FBDA的作用如下:

 

ü        FBDA首先從buffer cache中的undo表空間資料中查詢過去資料表時間點資料。這點是與flashback query的特性相似;

ü        如果要查詢的資料在undo tablespace中,但是該塊沒有在buffer cache中。FBDA會從undo segment中獲取到資料塊,複製在buffer cache中;

ü        當進行flashback archive操作的資料表發生修改的時候,FBDA會去將需要儲存的資料存放在對應的適當內部資料表中;

 

 

[oracle@oracle11g ~]$ ps -ef | grep fbda

oracle    5773     1  1 13:02 ?        00:00:00 ora_fbda_wilson

oracle    5775  5560  0 13:03 pts/0    00:00:00 grep fbda

 

 

注意,預設情況下fbda程式是不執行的。如果當前存在使用flashback archive功能的資料表,就會自動啟動fbda程式。

 

歸檔資料在flashback archive中是壓縮排行儲存的,稱為history table歷史表。在內部,歷史表時被壓縮並且分割槽儲存的。當儲存的歸檔資料超過了設定的retention時間間隔,舊資料會被自動的刪除purge

 

 

6Flashback Archive中的隱含表

 

Oracle 11g中的Flashback Archive本質是將資料表的變化資訊加以儲存,其中使用壓縮和分割槽表技術。當我們將一個資料表設定為flashback archive之後,會發現出現三個內部internal資料表。

 

 

SQL> desc SYS_FBA_TCRV_88294;

Name     Type           Nullable Default Comments

-------- -------------- -------- ------- --------

RID      VARCHAR2(4000) Y                        

STARTSCN NUMBER         Y                         

ENDSCN   NUMBER         Y                        

XID      RAW(8)         Y                        

OP       VARCHAR2(1)    Y                        

 

SQL> desc SYS_FBA_HIST_88294

Name           Type           Nullable Default Comments

-------------- -------------- -------- ------- --------

RID            VARCHAR2(4000) Y                        

STARTSCN       NUMBER         Y                        

ENDSCN         NUMBER         Y                        

XID            RAW(8)         Y                         

OPERATION      VARCHAR2(1)    Y                        

OWNER          VARCHAR2(30)   Y                        

OBJECT_NAME    VARCHAR2(128)  Y                        

(篇幅原因,有省略……

EDITION_NAME   VARCHAR2(30)   Y                        

 

 

SQL> desc SYS_FBA_DDL_COLMAP_88294;

Name                   Type          Nullable Default Comments

---------------------- ------------- -------- ------- --------

STARTSCN               NUMBER        Y                        

ENDSCN                 NUMBER        Y                        

XID                    RAW(8)        Y                        

OPERATION              VARCHAR2(1)   Y                        

COLUMN_NAME            VARCHAR2(255) Y                        

TYPE                   VARCHAR2(255) Y                        

HISTORICAL_COLUMN_NAME VARCHAR2(255) Y                        

 

 

ü        SYS_FBA_TCRV_XXX資料表負責記錄在特定的時間範圍(對應SCN範圍),進行特定操作的資訊記錄;

ü        SYS_FBA_HIST_XXX資料表的列包括資料行資訊和對應存在的SCN範圍。如果一個資料表發生DML或者DDL操作,引起資料的變化會直接儲存在該資料表中;

ü        SYS_FBA_DDL_COLMAP_XXX資料表負責記錄資料表列DDL變化情況。從資料列的資訊來看,就是一個特定的資料列的時間SCN範圍;

 

 

7Flashback Archive下的資料表查詢執行計劃

 

當使用flashback archive的時候,雖然書寫查詢query的格式同過去的flashback query基本相同。但是實際上,對應的執行計劃完全不同。

 

 

SQL> explain plan for select count(*) from t as of timestamp to_timestamp('2011/9/6 9:06:57','yyyy/mm/dd hh24:mi:ss');

Explained

 

SQL> select * from table(dbms_xplan.display);

 

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 2132445860

--------------------------------------------------------------------------------

| Id  | Operation                  | Name               | Rows  | Bytes | Cost (

--------------------------------------------------------------------------------

|   0 | SELECT STATEMENT           |                    |     1 |       |  1541

|   1 |  SORT AGGREGATE            |                    |     1 |       |

|   2 |   VIEW                     |                    | 10394 |       |  1541

|   3 |    UNION-ALL               |                    |       |       |

|*  4 |     FILTER                 |                    |       |       |

|   5 |      PARTITION RANGE SINGLE|                    |   339 |  8814 |   173

|*  6 |       TABLE ACCESS FULL    | SYS_FBA_HIST_88294 |   339 |  8814 |   173

|*  7 |     FILTER                 |                    |       |       |

|*  8 |      HASH JOIN OUTER       |                    | 10055 |    19M|  1368

|*  9 |       TABLE ACCESS FULL    | T                  |  4309 | 51708 |  1057

|* 10 |       TABLE ACCESS FULL    | SYS_FBA_TCRV_88294 |   201K|   388M|   310

--------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

   4 - filter("TIMESTAMP_TO_SCN"(TIMESTAMP' 2011-09-06 09:06:57.000000000')<1340

   6 - filter("ENDSCN"<=13407208 AND "ENDSCN">"TIMESTAMP_TO_SCN"(TIMESTAMP' 2011

              09:06:57.000000000') AND ("STARTSCN" IS NULL OR "STARTSCN"<="TIMES

              09:06:57.000000000')))

   7 - filter("STARTSCN"<="TIMESTAMP_TO_SCN"(TIMESTAMP' 2011-09-06 09:06:57.0000

              NULL)

   8 - access("T".ROWID=CHARTOROWID("RID"(+)))

   9 - filter("T"."VERSIONS_STARTSCN" IS NULL)

  10 - filter(("ENDSCN"(+) IS NULL OR "ENDSCN"(+)>13407208) AND ("STARTSCN"(+) I

              "STARTSCN"(+)<13407208))

Note

-----

   - dynamic sampling used for this statement (level=2)

 

35 rows selected

 

 

透過執行計劃我們可以清晰的看出flashback archive的特徵:

 

ü        對具有flashback archive特性的資料表進行歷史資料query的時候,輸入到最佳化器中的執行計劃就已經發生變化。隱含的對資料表T以及內部表的檢索查詢。將時間範圍轉化為對應的SCN條件,獲取對應時間片段的資料映象;

ü        從執行計劃看,三個資料表結合的大規模操作訪問效率不會很高。對內部壓縮資料表的訪問,可能意味著在進行歷史歸檔的查詢時效率不會很高。從實際使用看,flashback archive查詢的效能與flashback query的相差很多;

 

 

8flashback archive容量實驗

 

在官方的推薦意見中,通常是建議設定一個較大或者可以擴充的flashback archive儲存區。對於一些資料操作頻繁的資料表,即使壓縮的歷史資料量也是客觀的。

 

在建立flashback archive的時候,我們使用了retention引數,表示歷史資料保留的時間範圍。這個retention時間段是具有強制意義的,對Oracle而言反映了絕對的要求。如果歷史資料歸檔的歷史期超過了指定時間範圍,這部分歷史資料會自動的由Oracle進行儲存。

 

但是,如果我們設定的flashback archive空間過小,而資料表變動產生了閃迴歸檔資料量超過了設定空間,這種情況下Oracle如何進行決斷呢?

 

 

SQL> show user

User is "SYS"

 

SQL> create flashback archive flar2 tablespace mytest quota 10m retention 1 year;

Done

 

 

我們建立了一個容量為10mflashback archive空間,要求保留一年的時間。

 

 

 

SQL> grant flashback archive on flar2 to scott;

Grant succeeded

 

SQL> alter table t flashback archive flar2;

Table altered

 

SQL> select sysdate from dual;

SYSDATE

--------------------

2011/9/6 15:25:21

 

SQL> select count(*) from t;

  COUNT(*)

----------

     72226

 

(進行頻繁的DML操作)

 

--在一個DDL操作之後,資料操作hange

SQL> truncate table t;

 

如果使用資料表T設定的閃迴歸檔空間不足,而舊資料又沒有達到retention歸檔的範圍,此時Oracle會拒絕所有會產生flashback archive的操作。

 

當拒絕操作的時候,當前會話會被hange住。如果是一個DDL操作,即使將客戶端會話切斷,也不能終止操作,仍然可以看到後臺會話和Server Process。實驗中,筆者是使用OS級別的kill -9命令加以終止。

 

結論:在使用flashback archive的時候,要儘可能設定合理的retention期間和空間大小。不要由於空間問題引起會話操作hange死。

 

下篇中,我們著重討論與flashback archive相關的許可權問題和DML/DDL操作對閃迴歸檔的影響。

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

相關文章