1、新建測試表並插入數據:
2、模擬表數據誤刪並提交:
3、使用閃回查詢來查誤刪前表的數據:(表誤刪是在15:08分左右誤刪,因此在15:08分之前表的數據還是在的):
4、用現在的數據與誤刪前的數據做對比,找出被誤刪的數據:
5、恢復被誤刪的數據,
方法一:直接用insert into插入被誤刪的數據,使用insert into插入誤刪的數據,則原來未刪除的數據的rowid不變;
方法二:使用flashback 恢復,使用flashback恢復實際上是將表里面的數據delete,然后重新插入整個表的數據,表里面每行數據的rowid全部改變。如果表的數據很大,則閃回的時間也會相對久一點:
flashback table test to timestamp to_timestamp('2019-10-11 11:00:00','yyyy-mm-dd hh24:mi:ss');
如果執行上面flashback報錯:ORA-08189: cannot flashback the table because row movement is not enabled.(ORA-08189: 因為未啟用行移動功能, 不能閃回表),則執行下列語句"啟用行移動功能"
alter table table_name enable row movement;
總結:
oracle閃回查詢使用的是undo表空間,閃回查詢能恢復的時間點取決於undo表空間的大小和Undo_Retention參數有關。如果系統中Undo管理比較不合理,事務Undo數據量比較大而且頻繁,有失效的Undo前鏡像被覆蓋之后,恰恰有一個長時間查詢需要訪問這個前鏡像。這個時候,Oracle就只能說“抱歉”了,這也就是經典的ora-1555 snapshot too old的起源。
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/