FLASHBACK QUERY
1 Flashback query(閃回查詢)原理
Oracle根據undo信息,利用undo數據,類似一致性讀取方法,可以把表置於一個刪除前的時間點(或SCN),從而將數據找回。
--因此flashback query能夠查詢的時間是受undo保留時間限制的,事物提交後undo數據保留時間受下面兩個參數影響
1)undo_retention:指定事物commit後undo 將要保存的時間(秒),在ORACLE10g中默認的是900秒。
SQL> alter system set undo_retention=900;--調整undo_retention參數
2)GUARANTEE :保證undo_retention參數所設定的時間有效,這個是10g的新功能。SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
--開啓或關閉guarantee
3)GUARANTEE參數影響
在沒有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
3)flashback 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轉換成SCN,timestamp會被轉換成)
3 查看SCN 和TIMESTAMP 的對應關係
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss') from sys.smon_scn_time order by scn;
10g及之後的版本可以通過如下函數對timestamp和scn進行互相轉換
通過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 scn和timestamp對應關係
每隔5 分鐘,系統產生一次系統時間標記與scn 的匹配並存入SYS.SMON_SCN_TIME 表(由SMON 進程來進行Update操作),該表中記錄了最近1440個系統時間標記與scn 的匹配記錄,由於該表只維護了最近的1440 條記錄,即最近5 天內的記錄。
對系統時間標記與scn 的每5 分鐘匹配一次做個說明,比如:
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)不能Falshback到5天以前的數據。
2)閃回查詢無法恢復到表結構改變之前,因爲閃回查詢使用的是當前的數據字典。
3)受到undo_retention參數的影響,對於undo_retention之前的數據,Flashback不保證能Flashback成功。
4)對drop,truncate等不記錄回滾的操作,不能恢復。
5)普通用戶使用dbms_flashback包,必須通過管理員授權。命令如下:
SQL>grant execute on dbms_flashback to scott;