一、新建測試表並插入數據:oracle
二、模擬表數據誤刪並提交:測試
三、使用閃回查詢來查誤刪前表的數據:(表誤刪是在15:08分左右誤刪,所以在15:08分以前表的數據仍是在的):spa
四、用如今的數據與誤刪前的數據作對比,找出被誤刪的數據:.net
五、恢復被誤刪的數據,3d
方法一:直接用insert into插入被誤刪的數據,使用insert into插入誤刪的數據,則原來未刪除的數據的rowid不變;blog
方法二:使用flashback 恢復,使用flashback恢復其實是將表裏面的數據delete,而後從新插入整個表的數據,表裏面每行數據的rowid所有改變。若是表的數據很大,則閃回的時間也會相對久一點:事務
flashback table test to timestamp to_timestamp('2019-10-11 11:00:00','yyyy-mm-dd hh24:mi:ss');flash
若是執行上面flashback報錯:ORA-08189: cannot flashback the table because row movement is not enabled.(ORA-08189: 由於未啓用行移動功能, 不能閃回表),則執行下列語句"啓用行移動功能"
alter table table_name enable row movement; it
總結:
oracle閃回查詢使用的是undo表空間,閃回查詢能恢復的時間點取決於undo表空間的大小和Undo_Retention參數有關。若是系統中Undo管理比較不合理,事務Undo數據量比較大並且頻繁,有失效的Undo前鏡像被覆蓋以後,偏偏有一個長時間查詢須要訪問這個前鏡像。這個時候,Oracle就只能說「抱歉」了,這也就是經典的ora-1555 snapshot too old的起源。io
undo_retention從直接看就是設置Oracle Undo過時數據的保存期限,單位是秒。若是參數設置爲900秒,那麼Undo段數據在非Active狀態以後,會保留900秒。
若是根據這個守則,咱們進行一致讀和Flashback的時間就是經過這個參數來進行控制的。可是事實上,這個是有問題的。Undo的覆蓋動做是一個必然的過程,覆蓋與否是要和系統事務Undo消耗速率、Undo Tablespace大小乃至Undo數據文件可拓展性密切相關。
事實上,Undo_retention是一個「目標指望值」。用戶設置出這個值以後,Oracle內部會盡可能保證將Undo數據保留超過undo_retention設置的時間。在這個過程當中,Oracle會涉及到好比嘗試拓展Undo表空間數據文件、Undo Segment管理等內容。可是,若是「現實比較殘酷」,好比說Undo使用緊張、沒有額外的方法,那麼這個時間段也是不能保證的。
總結部份內容摘自:http://blog.itpub.net/27785870/viewspace-1777263/