文章出處

今天在操作數據庫的時候,發現數據操作錯誤,想要恢復,但是沒有用事務,按理說,設置成不默認提交事務,此時所做的各種操作都沒有反應到數據庫中。這時,你可以rollback事務,撤銷所有未提交的修改。不過,一旦commit了的話,就真沒辦法撤銷了。好在oracle還有時間戳方法。

第一種方法:

1.打開Flash存儲的權限
ALTER TABLE tablename ENABLE row movement ;
2.把表還原到指定時間點
flashback table tablename to timestamp to_timestamp(''2011-02-28 10:40:00'',''yyyy-mm-dd hh24:mi:ss'');
后面的參數為要還原的時間點

 

第二種:利用ORacle的快照進行查找某個時間點的數據
select * from tablename AS OF TIMESTAMP  (SYSTIMESTAMP - INTERVAL '100' MINUTE)

or

select * from tablename as of timestamp to_timestamp(2011-05-21 11:40:00','YYYY-MM-DD HH24:MI:SS');

這樣可以查詢到指定的時間段的數據,再把查詢到的數據復制到原來的表中。

例:

如果我們在前5分鐘誤刪除了表emp中的數據,我們可以進行如下操作:

找回原始數據

Select * from emp as of timestamp sysdate  -  6/1440

刪除原來的表   刪掉后創建一個備份表

Create table emp as (select * from emp as of timestamp sysdate - 6/1440);

可以做差,找到刪除的記錄=6分鐘前的原始數據—現在表中的記錄 再插入原來的表中提交

Insert into emp 

Select * From

(

select * From emp as of timestamp sysdate - 6/1440 Minus Select * from emp)

 

--timestamp(ags) 方法

--interval(時間間隔)類型用來存儲兩個時間戳之間的時間間隔

--當要回復被刪除的數據的時候

 

--查詢500分鐘之前的數據

select * from emp as of timestamp(systimestamp - interval '500' minute)

--查詢600秒之前的數據

select * from emp as of timestamp(systimestamp - interval '600' second)

--查詢5小時之前的數據

select * from emp as of timestamp(systimestamp - interval '5' hour)

--查詢一天之前的數據

select * from emp as of timestamp(systimestamp - interval '1' day)

--查詢1分鐘前的數據 (1天=1440分鐘) date-number=date

select * from emp as of timestamp sysdate - 1/1440

--查詢5小時前的數據

select * from emp as of timestamp sysdate - 5/24

--查詢 5小時內數據=內前刪除的5小時前表中的數據-現在表中的數據

--minus減去

select * from

(select * from emp as of timestamp sysdate -5000/1440 minus select * from emp)

從9i開始,oracle提供了閃回(flashback)功能。使用flashback table語句從撤銷段中(undo segmeng)讀取改表的過去映像,同時利用oracle9i中引入的回閃查詢功能重建表行。Undo_retention給出了回閃支持的最小時間。也就是說flashback最少可以支持undo_retention給出的時間,如果系統比較閑,則可以回閃更長的時間。如果系統處于忙時,有可能重用還沒有達到undo_retention時間吸納是的數據空間。注意:使用閃回的一個前提是表不能進行ddl操作,不但不能對ddl操作進行回閃,而且,無法閃回到ddl操作以前的數據了。

注意:不啟動行移動功能,不能閃回表

Alter table emp enable row movement;

這個命令的作用就是允許ORACLE修改分配給行的rowid。在ORACLE中,插入一行時就會為它分配一個rowid,而且這一行永遠擁有這個rowid。閃回表處理時會對EMP表完成DELETE 操作,并且重新插入行,這樣就會為這些行分配一個新的rowid。要支持閃回功能就必須允許ORACLE執行這個操作。

 

原文:http://blog.csdn.net/jiajane/article/details/49280277


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()