今天提交給客戶方一個sql腳本去跟新歷史數據,結果客戶那邊的部署人員犯了一個錯誤,直接拿系統賬號去部署,結果第一段代碼沒有執行成功,結果第二段代碼卻執行成功了,並且已經提交了的,。。。。由於事前沒有備份第二段更新表的數據,導致恢復標的數據非常困難,網上查找了半天,現在將找到的辦法歸納如下:
1. 執行如下SQL將test_temp表中的數據恢復到2016年7月7號,即腳本被執行之前時間點。
注意,這里一定要先刪除全部數據,否則可能會導致數據重復
1 SELECT * FROM DQAQTSW 2 AS OF TIMESTAMP TO_TIMESTAMP('2016-07-07 00:00:00', 3 'yyyy-mm-dd hh24:mi:ss');
delete from test_tmp;
insert into test_tmp select *
from test_tmp as of timestamp to_timestamp('2014-05-28 11:00:00','yyyy-mm-dd hh24:mi:ss')
commit;
或者得到sync的節點時間,基本和第一種方法是一致的。
1 select timestamp_to_scn(to_timestamp('2014-05-27 11:00:00','YYYY-MM-DD HH:MI:SS')) 2 from dual; 3 或 select * from sys.smon_scn_time order by time_dp desc; 4 得到結果 71547785 然后 5 insert into test_tmp select * from test_tmp AS OF SCN 71547785
注意:
truncate后的數據是無法恢復的
truncate table test_temp;
2. 下面看第三種(這種方法需要更高的管理權限,否則沒法查詢回復數據)
select * from v$sqlarea ; SELECT * FROM v$session; SELECT * FROM v$session a,v$sqlarea b WHERE b.ADDRESS = a.PREV_SQL_ADDR;
通過這條語句找到的數據是有限的 因為有的用戶可能已經斷開和oracle的連接了
如果你看到以上方法能夠解決你的問題,哪就不要猶豫,快點動 手吧,因為如果動手晚了,之前的操作的數據記錄可能就要被覆蓋了,因為存儲不大的話要被循環使用的
(以上博客很多引用來自 http://vvv-110.iteye.com/blog/2072702 )
