1. 程式人生 > >4. Oracle 閃回特性(Flashback Version、Flashback Transaction)

4. Oracle 閃回特性(Flashback Version、Flashback Transaction)

del undo 不同的 acl per posit brush 根據 into

轉載自:https://blog.csdn.net/leshami/article/details/6112981

Oracle閃回特性為數據的快速回復某一對象的特定數據提供了更多的便利。前面介紹了閃回的幾種特性,包括flashback database,flashback drop ,flashback query ,flashback table 。接下來本文將介紹Flashback Version與Flashback Transaction。

一、Flashback Version Query(閃回版本查詢)

閃回版本查詢指的是Oracle可以針對特定的對象來查詢某一特定段內該對象的變化的所有情況,可以對此跟蹤該對象的變更情況。
也可以根據特定的需要來將該對象修正到特定的時刻。回版本查詢同閃回查詢,閃回表一樣,同樣是使用了UNDO段的數據,
即數據變更的多次鏡像,當UNDO段的數據由於空間壓力而被清除,則產生無法閃回的情況。

--1.閃回版本查詢語法,使用VERSIONS BETWEEN 關鍵字
SELECT <columns>
FROM <schema_name.table_name>
VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn>   --基於SCN的版本查詢
[WHERE <column_filter>]
[GROUP BY <non-aggregated_columns>]
[HAVING <group filter>
[ORDER BY <position_numbers_or_column_names>]

SELECT <columns>
FROM <schema_name.table_name>
VERSIONS BETWEEN timestamp to_timestamp(‘start_timestamp‘) and to_timestamp(‘end_timestamp‘) --基於TIMESTAMP的版本查詢
[WHERE <column_filter>]
[GROUP BY <non-aggregated_columns>]
[HAVING <group filter>
[ORDER BY <position_numbers_or_column_names>]
    
--2.創建演示環境

--對表tb1作如下操作,插入empno為的記錄後,更新其職務,然後再刪除該記錄,最後再次插入該記錄
flasher@ORCL>create table tb1 tablespace users as select empno,ename,job,deptno from scott.emp; --創建表tb1
flasher@ORCL> insert into tb1 values(1000,‘Jack‘,‘Clerk‘,20);  --插入記錄
flasher@ORCL> commit;     --提交事務
flasher@ORCL> update tb1 set job=‘Manager‘ where empno=1000;   --將職務更新為Manager
flasher@ORCL> commit;     --提交事務
flasher@ORCL> delete from tb1 where empno=1000;    --刪除該記錄
flasher@ORCL> commit;    --提交事務
flasher@ORCL> insert into tb1 values(1000,‘Jack‘,‘President‘,20);  --重新插入該記錄
flasher@ORCL> commit;     --提交事務

--3.使用Version Query(閃回版本查詢)
--通過使用versions關鍵字來獲得版本信息
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
  2  versions_endscn v_edcn,versions_operation v_ops
  3  from tb1 versions between scn minvalue and maxvalue where empno=1000;  

EMPNO ENAME    JOB       XID                  V_STCN     V_EDCN V_OPS 
----- -------- --------- ---------------- ---------- ---------- ----- 
 1000 Jack     President 0A000C007E010000    1124320            I     
 1000 Jack     Manager   09000C00EE010000    1124301            D     
 1000 Jack     Manager   0A0009007E010000    1124282    1124301 U     
 1000 Jack     Clerk     06000E00A9010000    1124245    1124282 I     

上面的示例通過為表tb1中插入一條empno=1000記錄,並更新其職務,接下來對該記錄進行刪除,最後再次添加empno=1000,且職務不同的記錄,可以看出對empno=1000所作的不同的修改被全部記錄下來。

註意,一個事務中,如果多次對該記錄進行了修改,則查詢中僅僅顯示最後一次提交的狀態,我們可以通過使用versions between關鍵字來查詢對該表中的某條特定記錄修改的不同版本

查看不同的版本使用了類似於rowid的偽列
versions_xid          --記錄指定版本的事務的唯一標識符
versions_startscn     --記錄的起始SCN號
versions_endscn       --記錄的終止SCN號
versions_operation    --記錄的操作類型(DML操作,I表示插入,U表示更新,D表示刪除)
versions_starttime    --記錄被修改的起始時間
versions_endtime      --記錄被修改的終止時間

--也可以修改查詢的條件來獲取更多不同的版本,如下查詢則為查詢該記錄一個小時以內的不同版本
flasher@ORCL> select empno,ename,job,versions_xid xid,versions_startscn v_stcn,
  2  versions_endscn v_edcn,versions_operation v_ops
  3  from tb1 versions between timestamp
  4  to_timestamp(systimestamp-1/24) and systimestamp where empno=1000;

  

二、Flashback Transaction Query(閃回事務查詢)

閃回事務查詢是對閃回版本查詢的擴展。從某種程度上來說,閃回版本查詢通常用於更細粒度的查詢,如針對特定的記錄。而閃回事務則是
針對某一事務進行閃回,是基於事務級別的。閃回事務查詢通過查詢視圖flashback_transaction_query來獲得某個或多個特定事務信息,
同時可以根據該視圖中提供的undo_sql 列中的語句來反轉事務,從而保證數據的完整性。
查詢該視圖需要具有select any transaction權限,默認情況下sys用戶和DBA角色具有該權限

--下面演示基於事務的閃回示例

flasher@ORCL> create table tb2 tablespace users as select empno,ename,sal,deptno from scott.emp;  --創建表tb2
flasher@ORCL> insert into tb2 select 9999,‘Robinson‘,3000,50 from dual;  --插入新記記錄
flasher@ORCL> commit                                                   --提交事務一

flasher@ORCL> select * from tb2 where empno=9999;
 
EMPNO ENAME          SAL DEPTNO
----- -------- --------- ------
 9999 Robinson   3000.00     50

flasher@ORCL> update tb2 set sal=sal+500 where empno=9999;             --更新記錄         
flasher@ORCL> commit;                                                  --提交事務二 
flasher@ORCL> update tb2 set deptno=20 where empno=9999;               --再次更新記錄 
flasher@ORCL> commit;                                                  --提交事務三
 
flasher@ORCL> select empno,ename,sal,deptno,versions_xid,versions_operation
  2  from tb2 versions between scn minvalue and maxvalue        --使用Version Query查詢從中看到了三個事務
  3  where empno=9999;

     EMPNO ENAME             SAL     DEPTNO VERSIONS_XID     V
---------- ---------- ---------- ---------- ---------------- -
      9999 Robinson         3500         20 08000400C9010000 U
      9999 Robinson         3500         50 09001600BE010000 U
      9999 Robinson         3000         50 04002C00CA010000 I     -- I為最早的事務

flasher@ORCL> select operation,undo_sql from flashback_transaction_query
  2  where xid=hextoraw(‘09001600BE010000‘);        --根據事務號獲得一個反轉該事務的DML語句
 
OPERATION  UNDO_SQL
---------- --------------------------------------------------------------------------------
UPDATE     update "FLASHER"."TB2" set "SAL" = ‘3000‘ where ROWID = ‘AAANUPAAGAAAAAkAAN‘; 

flasher@ORCL> select operation,undo_sql from flashback_transaction_query
  2  where xid=hextoraw(‘08000400C9010000‘);        --根據事務號獲得一個反轉該事務的DML語句
 
OPERATION  UNDO_SQL
---------- --------------------------------------------------------------------------------
UPDATE     update "FLASHER"."TB2" set "DEPTNO" = ‘50‘ where ROWID = ‘AAANUPAAGAAAAAkAAN‘;           

從上面的兩個查詢中可以得到反轉事務的DML語句,直接執行相應的反轉語句,即可將事務變更到特定的狀態,有點類似於回滾,但不
是執行了回滾操作。

三、總結

1.Flashback Version 多用於查看某條特定記錄所有已提交的版本,包括每個版本的創建時間以及結束時間。
2.Flashback Transaction Query 多用於查看某個事務內的特定對象,可以通過視圖flashback_transaction_query構造倒退事務的DML語句。

  

4. Oracle 閃回特性(Flashback Version、Flashback Transaction)