flashback query

                                                                               FLASHBACK QUERY

1  Flashback query(閃回查詢)原理

Oracle根據undo信息,利用undo數據,類似一致性讀取方法,可以把表置於一個刪除前的時間點(SCN),從而將數據找回。

--因此flashback query能夠查詢的時間是受undo保留時間限制的,事物提交後undo數據保留時間受下面兩個參數影響

1undo_retention:指定事物commitundo 將要保存的時間(),在ORACLE10g中默認的是900秒。

SQL> alter system set undo_retention=900;--調整undo_retention參數

2GUARANTEE 保證undo_retention參數所設定的時間有效,這個是10g的新功能。SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;

--開啓或關閉guarantee

3GUARANTEE參數影響

在沒有guarantee的保證下,ORACLE並不能保證能夠將undo信息存儲900秒,如果undo表空間不足,那麼ORACLE將忽略undo_retention的設置,直接覆蓋掉以前的undo(覆蓋掉最早的undo數據),這個時候有可能會產生ORA-01555錯誤。如果undo表空間空間足夠,那麼undo將會保存很長一段時間,直到undo表空間達到maxsize,這個時候纔會覆蓋undo信息,而且ORACLE會從最早的undo信息開始覆蓋。

ORACLE推薦我們爲undo 表空間中的datafile 設定MAXSIZE ,不要讓它一直自動擴展,如果ORACLE獲得了自動擴展的能力,那麼舊的undo不會被覆蓋,到後來undo表空間會越來越大,越來越大,直到將磁盤空間耗盡(直到擴大到數據文件的最大值,8K的數據塊爲32G)。

在有guarantee的保證下,ORACLE將會保證undo信息能夠保存到undo_retention設定的值之後才被覆蓋,如果這個時候同時執行了很多事物,將undo表空間耗完了,那麼那個事物會失敗,會報ORA-30036 錯誤,所以使用guarantee一定要慎用,如果非要使用guarantee,那麼儘量將undo 表空間設大一點。

2   flashback query語法

1)獲取數據刪除前的一個時間點和scn,如下:

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time,to_char(dbms_flashback.get_system_change_number) scn from dual;

TIMESCN

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

2014-02-21 09:43:08 556374

--9i之前使用上面的語句

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') time,current_scn scn from v$database;

TIMESCN

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

2014-02-21 09:44:23556400

--9i之後使用如上方法

--

2)模擬誤刪數據

SQL> delete oltp_compress where object_id='29';

1 row deleted.

SQL> commit;

SQL> select * from oltp_compress where object_id='29';

no rows selected

3flashback query查詢被刪除的數據

SQL> select count(1) from oltp_compress as of scn 556400 where object_id='29';

COUNT(1)

----------

1

--利用scn閃回

SQL> select count(1) from oltp_compress as of timestamp to_timestamp('2014-02-21 09:44:23','yyyy-mm-dd hh24:mi:ss') where object_id='29';

COUNT(1)

----------

1

--利用時間閃回(當通過TIMESTAMP 來查詢歷史數據時,數據庫會吧TIMESTAMP轉換成SCNtimestamp會被轉換成)

3   查看SCN TIMESTAMP 的對應關係
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time order by scn;

10g及之後的版本可以通過如下函數對timestampscn進行互相轉換

通過scn_to_timestamp函數可以將SCN轉換爲時間戳

select scn_to_timestamp(8908390522972) scn from dual;

通過timestamp_to_scn可以將時間戳轉換爲SCN:

select timestamp_to_scn(scn_to_timestamp(8908390522972)) scn from dual;

4    scntimestamp對應關係

每隔分鐘,系統產生一次系統時間標記與scn 的匹配並存入SYS.SMON_SCN_TIME (SMON 進程來進行Update操作),該表中記錄了最近1440個系統時間標記與scn 的匹配記錄,由於該表只維護了最近的1440 條記錄,即最近天內的記錄。

對系統時間標記與scn 的每分鐘匹配一次做個說明,比如:

SCN:339988 對應 2011-01-25 17:00:00

SCN:339989 對應2011-01-25 17:05:00

當查詢2011-01-25 17:00:00 2011-01-25 17:04:59 這段時間點內的SCN時,oracle 都會將其匹配爲SCN:339988

--如果SCN TIMESTAMP的映射不能寫入到smon_scn_time表中,我們就不能進行SCN TIMESTAMP轉換,就不能利用timestamp進行相關的操作

啓用Flashback Query的語法可以接受一個時間標記或者一個SCN。如果使用SCN,那麼閃回的時間點就是精確的。如果指定一個時間點,那麼這個時間點將會映射爲一個精度爲3秒鐘的SCN

5   Falshback query查詢的侷限:

1)不能Falshback5天以前的數據。

2)閃回查詢無法恢復到表結構改變之前,因爲閃回查詢使用的是當前的數據字典。

3)受到undo_retention參數的影響,對於undo_retention之前的數據,Flashback不保證能Flashback成功。

4)對drop,truncate等不記錄回滾的操作,不能恢復。

5)普通用戶使用dbms_flashback包,必須通過管理員授權。命令如下:

SQL>grant execute on dbms_flashback to scott;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章