Oracle Flashback Archive——Oracle閃迴歸檔(中)
Flashback archive是Oracle 11g中推出的新歷史資料查詢新特性。對比過去的flashback query,flashback archive具有更強的時間準確和物件針對性。
5、Flashback Archive元件和FBDA程式
Flashback Archive特性是Oracle 11g中新推出的。每個新特性的推出,大都伴隨著Oracle體系結構的不斷豐富和調整。
Oracle Total Recall元件是Flashback Archive功能的元件名稱。作為一個獨立元件在Oracle安裝的時候是會進行預設安裝的。從Oracle 官方資料中看,Flashback archive的作用是跟蹤一個或者多個資料錶的歷史history資料變化,將其儲存在一個或者多個表空間中。
藉助Oracle 11g的Total Recall元件,Oracle會對資料表資料的變化進行自動的跟蹤記錄,記錄在設定的flashback archive裡。這個過程中,Oracle會進行相應的最佳化工作,將歸檔資料進行壓縮、分割槽。這樣做的效果可以在最小影響應用程式DML操作,並且對應用程式透明的情況下將資料進行歸檔儲存。
為了實現Flashback Archive的功能,Oracle新引入了一個例項程式為FBDA(Flashback 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。
6、Flashback 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範圍;
7、Flashback 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的相差很多;
8、flashback 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
我們建立了一個容量為10m的flashback 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Flashback Archive——Oracle閃迴歸檔(上)OracleHive
- Oracle Flashback Archive——Oracle閃迴歸檔(下)OracleHive
- 閃回資料歸檔-- Flashback Data ArchiveHive
- Oracle 11g新特性--閃回資料歸檔(flashback data archive)[zt]OracleHive
- Oracle 11g 閃迴歸檔Oracle
- oracle archive歸檔初步OracleHive
- Oracle Flashback Data ArchiveOracleHive
- 【FLASHBACK】Oracle flashback data archive 介紹OracleHive
- oracle archive log 歸檔日誌OracleHive
- oracle 閃回 flashbackOracle
- Flashback Data Archive (Oracle Total Recall)HiveOracle
- Oracle archive log 歸檔日誌管理OracleHive
- [Archive]更改ORACLE預設歸檔路徑HiveOracle
- Oracle閃回資料歸檔Oracle
- 開閃回及閃迴歸檔
- Oracle 閃回特性(FLASHBACK DATABASE)OracleDatabase
- DBMS_FLASHBACK_ARCHIVE在Oracle版本中的支援情況HiveOracle
- How To Using Flashback Data Archive (Oracle Total Recall)HiveOracle
- 【oracle 】閃回與歸檔位置的理解Oracle
- oracle11g flashback archive feature新特性OracleHive
- Oracle 11g 閃回資料歸檔Oracle
- Oracle閃回技術--Flashback Version QueryOracle
- 開啟oracle的flashback閃回功能Oracle
- Flashback_oracle閃回功能的使用Oracle
- 【Flashback】11g的閃回資料歸檔初探
- 閃迴歸檔的簡單測試
- oracle 11g 新特性 Flashback Data Archive 說明OracleHive
- [zt] Oracle 11g 閃回資料歸檔Oracle
- 11G flashback data archive 導致產生大量歸檔日誌Hive
- oracle 歸檔/非歸檔Oracle
- 【備份恢復】 閃回技術之閃迴歸檔
- oracle歸檔Oracle
- 關於oracle閃回資料歸檔的總結Oracle
- Oracle 11g開啟閃回功能FlashbackOracle
- Oracle Database 11g閃回技術flashbackOracleDatabase
- oracle flashback特性(1.2)--閃回查詢之As of scnOracle
- Oracle OCP 1Z0 053 Q138(DROP FLASHBACK ARCHIVE)OracleHive
- Oracle OCP IZ0-053 Q166(Flashback Data Archive)OracleHive