今天在操作數據庫的時候,發現數據操作錯誤,想要恢復,但是沒有用事務,按理說,設置成不默認提交事務,此時所做的各種操作都沒有反應到數據庫中。這時,你可以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
文章列表