1. 程式人生 > >Update誤操作後如何恢復資料

Update誤操作後如何恢復資料

問題
今天在公司操作使用者表,要求更新某個使用者的密碼欄位,結果在寫更新語句的時候忘記加條件了,導致所有使用者資料都被更新了,瞬間慌神了,表中可有幾十條資料,而且密碼都是MD5加密的,於是趕緊查資料,使用了資料恢復方法,目前資料已成功恢復,所以在這裡總結一下,希望以後在遇到同樣問題的時候能夠快速的解決。

解決方法
系統:windows xp 
資料庫:oracle9i 
工具:plsql

採用的方法就是利用oracle資料庫的基於時間查詢as of timestamp語句的辦法進行恢復資料,下面以一個簡單地例子進行演示。 
1.比如我新建test1表,目前表中有以下三條資料 
 
2.我現在做一個update操作,要把id=1的PASSWD欄位更新為123456,但是由於我操作的失誤,id=1條件忘了加了,導致整表更新了,其他記錄的PASSWD欄位全部都是123456。 
Sql:update test1 set passwd=’123456’; 
誤操作後結果: 
 
3.此時我們可以採用oracle的基於時間查詢的辦法查詢出5分鐘前的表的記錄情況,查詢SQL如下: 
SELECT * FROM test1 AS OF TIMESTAMP SYSDATE – 5/1440 
查詢結果: 
 
對SQL的解釋說明: 
SYSDATE :當前時間 
1440 :24h*60m=1440m 
4.通過上面的查詢,我們看到了在update之前的資料情況。那麼把資料恢復回去就很簡單了,通過ID關聯的方式更新回去即可。如下: 
update test1 t1 set t1.passwd = (select passwd from test1 AS OF TIMESTAMP SYSDATE - 5/ 1440 where t1.id = id); 
更新後結果: 


總結
這種做法也是DBA常用的恢復資料的手段。對於刪除的情況,那麼就通過insert辦法重新把記錄插入表即可。 
提醒 
最後需要 特別提醒大家注意的是,SQL中的SYSDATE-5/1440代表查詢5分鐘前的記錄情況,由於是和當前時間SYSDATE的距離5分鐘前,所以這個隨著隔的時間不同及時間的推移是會變化的,一般的做法是在真正做恢復時的update前,需要先select查詢一下比如5分鐘前的資料是否是我們想要的資料,確認無誤後立即做恢復的update。如果資料不是我們想要的,那麼就需要通過調節分鐘數直到找到我們想要的資料。這種辦法適合小批量資料,如果是大批量資料且很重要的資料的話,建議大家新建一張結構相同的表,先把as of timestamp查詢出來的資料存到新表中,再進行恢復操作,因為這樣資料不再受時間差的影響,確保資料是準確的,無論你何時開始做恢復操作都沒有問題。
--------------------- 
轉載:https://blog.csdn.net/z4331016/article/details/78860554 

提示:   這個操作對許可權要求較高