ORACLE恢復一個數據表的方法


今天提交給客戶方一個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; 
3select * 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 )

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM