聊聊閃回版本查詢Flashback Version Query
“忘記備份”是幾年前看一位行業前輩的經驗談中讓筆者記憶深刻的工作軍規。對DBA而言,備份通常指的是“Media Backup”,在Oracle世界中就是各種冷備份檔案、備份集合和歸檔日誌。
工作時間越長,膽子其實就是越小。很多很多時候,有備份並不意味著可以高枕無憂。這種論斷主要是基於兩方面的因素,其一是備份的有效性,雖然有各種工具系統介質負責備份工作,但是備份是不是有效一直是運維工程師心中的噩夢。第二個因素是恢復時間,大部分的Media Recovery都需要停機停服務,這對於7*24小時的高可用應用是不能允許的。另一方面,在現代企業級別資料中心環境下,如果存在正當的管理流程和方法,大規模資料恢復、回退的情況是比較少見的。
相應的,小規模資料恢復,如資料表一行資料被莫名誤修改、資料表誤刪除等需要恢復的需求卻不斷增加。在傳統的恢復技術中,這樣粒度的恢復操作一般是不能支援的。
從10g開始,Oracle開始大面積引入“Flashback”技術,或者成為Flashback技術工具集合,來提供多級別多粒度的“邏輯恢復”。經過若干年的發展,Flashback家族已經有諸多的分支技術,依託不同的技術技術,來實現多粒度的資料恢復。在筆者之前的文章中,已經陸續介紹了一些Flashback技術和應用,本篇繼續介紹Flashback Version Query。
1、環境介紹
筆者選擇Oracle 11g進行測試,具體版本為11.2.0.4。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 – Production
Flashback Version Query的配置基礎和Flashback Query相同,都需要啟用Automatic Undo Management,通過Undo_Retention進行控制時間長短。
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
為了實驗方便,調整undo_retention到1800。
SQL> alter system set undo_retention=1800 scope=both;
System altered
SQL> show parameter undo_re
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_retention integer 1800
建立實驗資料表。
SQL> create table test as select empno, ename, sal from scott.emp where rownum<3;
Table created
SQL> commit;
Commit complete
SQL> select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7499 ALLEN 1600.00
2、Flashback Version Query
Flashback Version Query和Flashback Query從技術基礎上,都是相似的,也就是藉助Oracle的Undo機制。作為一款成功的資料庫產品,Undo和Redo機制是Oracle最核心的技術。Undo記錄的是資料DML操作的前映象,經典的Oracle事務模型中,一旦事務被commit,理論上之後SCN啟動的讀操作都不能讀到之前的映象資料。
Oracle於是利用Undo的機制,提供了短時間內的資料表舊版本查詢。通過as of {timestamp | scn}指定時間點,就可以進行查詢。當然,這個舊版本時間並不是無限長度,這就涉及到undo_retention這個爭議引數。
很多朋友都不是很理解undo_retention,這個以秒為單位的引數經常讓人很抓狂。官方理解是:設定undo_retention之後,可以支援設定秒數的閃回資料查詢。但是在實際工作中,卻發現很多時候超過這個時間的資料也能檢索到,但是有的時候沒有到這個時間間隔舊版本資料,也不能找到。
其實,Undo_retention引數其實是使用者建議Oracle資料庫的一個“建議理想值”。試想一下,Undo資料是一個不斷迴圈覆蓋使用的空間,舊Undo前映象一定會被新Undo前映象覆蓋。事務負載不同的系統,對Undo的使用情況也是不同的。
如果Undo_Retention保留的時間比較長,而恰恰資料庫系統是一個事務操作頻繁的系統,那麼Oracle如果想要堅持undo_retention,就必須維持一個比較大可擴充的Undo Tablespace。這時候,如果恰恰Undo Tablespace的檔案被設定為不可擴充的,那麼Oracle也就不能保證undo_retention的理想值了。
引數retention grantee是設定在undo tablespace的引數設定。如果設定了這個引數,就表示Oracle一定要保證undo_retention的理想設定值,即使不能完成事務過程。
Flashback Query和Flashback Version Query,都是依賴Undo過期資料的來構建前映象的操作。
與Flashback Query不同的是,Flashback Version Query引入了一些資料表“偽列”,可以提供對資料版本的操作和檢索。下面通過一個SQL來檢視。
SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;
XID START_SCN ENDSCN OPERATION EMPNO
---------------- ---------- ---------- --------- -----
7369
7499
資料表test,顯然沒有諸多的列定義。從這個情況看,flashback query提供了一種資料行級別的版本查詢操作。先來看一下引入的資料偽列含義,本截圖是從Oracle 11g官方文件中提取出的截圖。
ü Versions_Startxxx表示資料行的最開始出現時間,可以使用SCN或者timestamp表示,如果這個欄位為null,表示該資料從undo資料中沒有找到對應的版本記錄;
ü Versions_Endxxx表示資料行的截止時間,如果為空,表示資料為當前記錄或者已經經過delete操作;
ü Versions_xid為事務對應的唯一標識,表示該資料行的變化是被哪個事務操作的;
ü Versions_operation:操作內容;
3、操作實驗
下面經過一系列實驗,來確定Flashback Version Query使用。原始資料情況如下:
SQL> select * from test;
EMPNO ENAME SAL
----- ---------- ---------
7369 SMITH 800.00
7499 ALLEN 1600.00
進行資料增加操作。
SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno from test versions between scn minvalue and maxvalue;
XID START_SCN ENDSCN OPERATION EMPNO
---------------- ---------- ---------- --------- -----
7369
7499
0A001B00D3870100 24306083 I 1000
versions_operation表示“I”,為新增加的資料。start_scn為資料插入的SCN記錄,xid為事務的標示。
SQL> update test set sal=200 where empno=7369;
1 row updated
SQL> commit;
Commit complete
SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, sal from test versions between scn minvalue and maxvalue;
XID START_SCN ENDSCN OPERATION EMPNO SAL
---------------- ---------- ---------- --------- ----- ---------
0200110020160000 24306146 U 7369 200.00
24306146 7369 800.00
7499 1600.00
0A001B00D3870100 24306083 I 1000 200.00
U表示資料修改後的版本資料。如果刪除資料,如下操作:
SQL> delete test where empno=7499;
1 row deleted
SQL> commit;
Commit complete
SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;
XID START_SCN ENDSCN OPERATION EMPNO ROWID
---------------- ---------- ---------- --------- ----- ------------------
0A001100D3870100 24306188 D 7499 AAAtPCAABAAAeu5AAB
0200110020160000 24306146 U 7369 AAAtPCAABAAAeu5AAA
24306146 7369 AAAtPCAABAAAeu5AAA
24306188 7499 AAAtPCAABAAAeu5AAB
0A001B00D3870100 24306083 I 1000 AAAtPCAABAAAeu6AAA
通過上面的資料,是可以做到跟蹤整個Undo_retention中資料變化的情況。下面監控一下事務標記資訊。
SQL> delete test;
2 rows deleted
SQL> select xid from v$transaction;
XID
----------------
0A000300C3870100
SQL> commit;
Commit complete
SQL> select versions_xid xid, versions_startscn start_scn, versions_endscn endscn, versions_operation operation, empno, rowid from test versions between scn minvalue and maxvalue;
XID START_SCN ENDSCN OPERATION EMPNO ROWID
---------------- ---------- ---------- --------- ----- ------------------
0A000300C3870100 24306249 D 7369 AAAtPCAABAAAeu5AAA
0A001100D3870100 24306188 D 7499 AAAtPCAABAAAeu5AAB
0200110020160000 24306146 24306249 U 7369 AAAtPCAABAAAeu5AAA
24306146 7369 AAAtPCAABAAAeu5AAA
24306188 7499 AAAtPCAABAAAeu5AAB
0A000300C3870100 24306249 D 1000 AAAtPCAABAAAeu6AAA
0A001B00D3870100 24306083 24306249 I 1000 AAAtPCAABAAAeu6AAA
7 rows selected
從v$transaction中獲取到的資料XID,可以在其中對應上。
4、結論
Flashback Version Query是Oracle Flashback系列的一個技術。雖然基於的Undo過期資料時間上是有限制的,結合Flashback Transaction Query,可以做到很好的事務級別資料恢復。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17203031/viewspace-1712642/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 閃回版本查詢(Flashback Version Query)
- [閃回特性之閃回版本查詢]Flashback Version Query
- Flashback Query閃回查詢
- 聊聊閃回事務查詢Flashback Transaction Query
- Oracle閃回技術--Flashback Version QueryOracle
- 【閃回特性之閃回事務查詢】Flashback Transaction Query
- oracle flashback特性(1.4)--閃回查詢之Transaction queryOracle
- 閃回之 Flashback Query (dml表、過程、函式、包等)、Flashback version Query函式
- 【Flashback】使用檢視快速獲得Flashback Query閃回查詢資料
- 閃回查詢之閃回版本查詢
- 全面學習oracle flashback特性(1.4)--閃回查詢之Transaction queryOracle
- flashback query閃回資料
- 【徵文】全面學習oracle flashback特性(1.4)--閃回查詢之Transaction queryOracle
- 閃回版本查詢與閃回事務查詢
- 閃回版本查詢操作
- Oracle9i Flashback Query 閃回查詢總結 --- (通過SCN恢復)Oracle
- 閃回版本查詢技術:
- oracle flashback特性(1.2)--閃回查詢之As of scnOracle
- Oracle閃回查詢,閃回版本查詢與閃回事務查詢的使用區別總結Oracle
- flashback技術之---flashback version query
- Oracle 11G 閃回技術 閃回版本查詢和閃回事務查詢Oracle
- 使用FLASHBACK_TRANSACTION_QUERY查詢回滾事務SQLSQL
- oracle閃回版本查詢學習Oracle
- 閃回查詢之閃回表查詢
- oracle flashback特性(1.1)--閃回查詢之As of timestampOracle
- flashback version query和 flashback transaction query簡單應用
- 【閃回特性之閃回查詢】使用閃回查詢(select as of)
- 閃回表、閃回查詢
- 【備份恢復】閃回技術之閃回版本查詢
- Oracle 11G 閃回技術 使用閃回版本查詢Oracle
- oracle flashback特性(1.5)--閃回查詢之制約因素Oracle
- Oracle9i,.10g 閃回查詢(flashback)Oracle
- Oracle 11g 閃回版本查詢Oracle
- 閃回查詢
- 閃回(關於閃回查詢)
- 閃回刪除、閃回查詢
- oracle 10g flashback version query 和 flashback transaction query實驗Oracle 10g
- Oracle Flashback query查詢的侷限Oracle