一次誤刪數據的恢復過程

昨天犯了有史以來最大的錯誤,就是誤刪了一個大表其中30萬條記錄。由於很多程序都依賴於這個表,所以很快就有好幾個用戶向我反映了情況。

 

我急忙尋找方案,希望有簡便的方法恢復數據,可是沒有。後來我發現有好幾個地方都推薦Log Explorer這個軟件,可以讀取SQL Server日誌,恢復刪除的數據。於是我顧不上支持正版了,立馬搜索,結果在chinaz上面找到了“特別版”,在服務器上安裝,運行。

 

程序要求我輸入sa的密碼,我輸入以後,它自動建立一個新數據庫,然後讓我選擇要連接的日誌,或者同時可以連接數據庫備份(不過我顧不上這個功能)。連接Online Log以後,便可以點擊View Log了,或者可以實時跟蹤數據庫的操作日誌(Real-time Monitor)。

 

View Log的功能顯示了好幾天以前的日誌一直到最新的操作記錄,而且每組事務用不同的背景色來區分,一目瞭然。找到了我誤刪數據的那組事務以後,就在這組事務上右鍵選擇恢復整組事務。然而,畢竟它不可能強大到和rollback那樣(因爲rollback實現原理完全不一樣啊),30萬的數據量的恢復方法是:程序根據每條刪除的數據生成insert語句,放在一個.sql文件中,讓用戶自己到ssms(2000麼就是查詢分析器)去運行這個文件。杯具啊!它在生成到一半的時候彈出錯誤框了。我一看桌面已經有一個recovery.sql了,就拿去運行,結果運行到一半ssms說沒有足夠的內存(服務器內存2G)。更可怕的是,這個文件已經196MB了,我用notepad++打開,竟然還只有7萬條insert語句!於是這個方案放棄。

 

後來依然決定:拿今天早上的數據庫備份先恢復到一個新數據庫裏去,再把新庫裏這個表的數據複製到我的庫裏,然後再到Log Explorer裏找到那組事務,不恢復全部,只恢復當天生成的新記錄。(就是說,備份是1/14號8點的,我恢復以後,再用Log Explorer單獨只找8點以後的數據,恢復)

 

實踐證明這是可行的,感謝Log Explorer的強大(雖然要恢復一個事務中的部分記錄,需要一條條選中恢復,不能多選,搞了我15分鐘,手痠死,恢復後竟然部分中文還有亂碼,而且只亂第一個字)。

唯一鬱悶的是我恢復數據庫就搞了半天,原來要恢復差異備份的話,在恢復完全備份的時候必須選擇停用數據庫。然後恢復差異備份的時候就可以選擇保持數據庫可用了。

 

這次的經驗教訓我會一直記住的:首先每週完全備份每日差異備份是必須的,然後一定要記得begin tran,否則總有一天真有苦頭吃

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章