閃回查詢通過對復原段中儲存的前鏡像資料進行追溯,可以獲得變更之前的資料,從而在前鏡像被覆蓋之前,提供一種快捷的恢複和回退方式。
閃回特徵受到初始化參數UNDO_RETENTION的影響,
ALTER SYSTEM SET UNDO_RETENTION=10800 SCOPE=BOTH; 增大這個參數可能會導致更多的UNDO資料表空間使用。
在生產環境中修改這樣一個參數需要謹慎:
1.盡量在測試後在生產環境中執行某行特定的維護操作。
2.在生產環境空閑時才執行某些特定的維護操作。
在Oracle 10gR1 RAC環境下修改UNDO_RETENTION參數,使用如下命令:
alter system set undo_retention=18000 sid='*';
這條命令直接導致RAC的其他節點掛起,Oracle記錄了一個相關的Bug,Bug號為4220405,Oracle提示不指定具體SID的UNDO_RETENTION修改在該版本中不被支援,可分別修改不同的執行個體。
通過閃回查詢恢複誤碼刪除資料的執行個體:
資料庫運行在歸檔模式下,可以首先通過V$ARCHIVED_LOG視圖來確認資料庫的SCN變化:
SQL> col fscn for 99999999999999999999999
SQL> col nscn for 9999999999999999999999
SQL>select name,FIRST_CHANGE# fscn,NEXT_CHANGE# nscn,FIRST_TIME from v$archived_log;
獲得當前的SCN
SQL>select dbms_flashback.get_system_change_number fscn from dual;
使用應用使用者嘗試閃回:
SQL> connect username/password
現在資料:
SQL>select count(*) from hs_passport;
建立恢複表如下:
SQL>create table hs_passport_recov as select * from hs_passport where 1=0;
根據開發人員提供的大致誤操作時間,結合V$ARCHIVED_LOG視圖,選擇適當SCN向前執行閃回查詢:
SQL>select count(*) from hs_passport as of scn 12929970422;
嘗試多個SCN,擷取最佳值(如果能得知具體時間,那麼可以獲得準備的資料閃回);
SQL>select count(*) from hs_passport as of scn &scn:
最後選擇恢複SCN時間點
SQL>insert into hs_passport_recov select * from hs_passport as of scn 129.....
向當前表中補回誤碼刪除的資料並確認資料是否補擠,至此閃回恢複成功。