oracle閃回版本查詢學習

花花蘑菇發表於2016-08-31

自己做了個實驗,看看閃回版本查詢是咋回事。

閃回版本的查詢是基於undo表空間的。所以undo一定要夠用夠大,並且undo日誌儲存的時間最好也夠長,否則查詢時會報錯:ORA-30052:下限快照表示式無效。這個時候要麼修改查詢的時間範圍,要麼把undo日誌的儲存時間設定大一些:alter system set undo_retention=1800 scope=both;

閃回版本查詢語句可以用以下兩種:

1) select versions_starttime, versions_endtime, versions_xid, versions_operation, t.* FROM  lxm.t  VERSIONS
BETWEEN TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS');

或者

select versions_startscn, versions_endtime, versions_xid, versions_operation, t.* FROM  lxm.t  VERSIONS
BETWEEN TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS');

2) select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q where q.xid in (select versions_xid from lxm.t versions between
TIMESTAMP TO_TIMESTAMP('2016-08-31 13:50:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2016-08-31 14:05:00', 'YYYY-MM-DD HH24:MI:SS'));


第一種語句:

先看第一種語句的實驗結果:

versions_xid 表示事務編號。我分別做了insert、update和delete的操作。主要是 update,如果versions_starttime 和 versions_endtime的值一樣,那麼這兩條記錄分別記錄update前和update後的值,帶U的那條記錄就是update後的值,不帶U的記錄就是update前的值。

下面這個圖表示做了兩次update:

注:這裡的scn號是系統的currernt_scn號,可以用以下語句查詢:

                select current_scn from v$database;

       scn號可以和時間戳互相轉換,語句如下:

      select to_char(scn_to_timestamp(1963220),'YYYY-MM-DD HH24:MI:SS') from dual;
      select timestamp_to_scn(to_date('2011-04-14 11:10:25','YYYY-MM-DD HH24:MI:SS')) from dual;

這種語句查詢不需要例項做任何額外的改動。

第二種語句:

第二種語句如果想要執行結果成功,需要例項做一些改變。例項需要開啟補充日誌記錄。否則查詢出來的結果operation欄位只有UNKOWN和BEGIN兩個值,undo_sql欄位則為空。

開啟補充日誌記錄:

SQL> alter database add supplemental log data;

Database altered.

SQL> alter database add supplemental log data (primary key) columns;

Database altered.

檢視是否開啟補充日誌記錄:

SQL> select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI from v$database;
SUPPLEMENTAL_LOG_DATA_MIN SUPPLEMENTAL_LOG_DATA_PK SUPPLEMENTAL_LOG_DATA_UI
------------------------- ------------------------ ------------------------
YES                       YES                      NO

第二種語句查詢的實驗結果:

可以看到結果比第一種查詢語句簡潔明瞭得多,展示了操作型別,撤銷操作的sql語句。


最後補充:普通使用者在執行閃回事務查詢之前,必須為使用者授予適當的DBMS_FLASHBACK包上的許可權。

   grant execute on dbms_flashback to user;

   grant select any transaction to user;


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

相關文章