由於長時間從事企業應用系統開發,前往用戶現場升級、調試系統是比較常做的事情,但是就在周一,由於同事的失誤在毫無知覺的情況下誤刪了生產數據庫幾乎所有的數據。當我發現的那一刻,感覺頭發都立起來了,心想這他娘的是要領盒飯了。
為了迅速恢復系統的使用,在當時的情況下立即關閉相關系統的訪問入口,前后共花費不到五分鍾。經過思考,立即將最近的一次備份文件進行還原,從而保證了系統的正常運行,但是此舉也不可避免的可能會丟掉某些數據。
另外事情已經發生,如何做才能為以后的數據恢復做准備呢,以下是自己的觀點:
1、務必冷靜,事情已經發生不可慌亂。
2、立即查看當前時間,最好能夠精確到秒,並做記錄。
3、應立即向直接上級反映此事,不可隱瞞,防止事態擴大。
4、如果權限允許,應當立即停止相關應用,防止有新的數據寫入數據庫。
事后一直不放心,當下次再出現這種情況的時候,該如何對數據進行數據恢復,盡可能的減小損失呢(做不到完全避免損失),因此從網上查閱大量資料並進行整理。
之前生產數據庫使用的是sqlserver2000和2005,當時也出現過誤刪數據的情況,用Log Exlorer For SQL很輕松就恢復了數據,現在數據庫升級到2012了這個工具無法使用了,因此只能采用其他辦法,在此需要特別鳴謝CSDN一位大神的文章,網址:http://blog.csdn.net/dba_huangzj/article/details/8491327
原文是SQLSERVER2008R2,本次試驗環境是2012版本。根據文章中過程的介紹,進行了整個過程的操作,但是還是未能一遍完成,現在在自己的操作過程中進行總結,並分享。
在此構建一個新的數據庫模擬數據恢復全過程。
1、構建新數據庫以及寫入一些數據
2、做一次完整備份,這個是前提,沒有一份完整備份文件是無法進行接下來的操作的。
注意:如上圖所示,恢復模式一定要選完整,如果是其他類型那恐怕就沒有下文了。一般來講新建數據庫的時候,默認不要去改恢復模式這個屬性。
3、寫入一條新數據
4、刪除數據,讓悲劇重現,記住此時要記錄時間點,在現實中往往會由於慌亂忘記記錄,但是希望看了這個文章之后能夠記住此事。
好既然悲劇已經發生,也有了心理准備和恢復前准備,此刻最好看一下系統時間。接下來就要演示如何進行數據恢復。
5、做事務日志備份,做事務日志備份需要注意一下一點,如圖所示
備份模式請選擇事務日志,備份路徑自行決定
進入選項,將可靠性第1、2勾選,事務日志選擇第二個,壓縮屬性可以不選擇.點擊確定備份成功,此時數據庫將顯示為正在還原狀態
注意:如果備份失敗,請檢查該數據庫是否正在被占用,如果是請kill。
--使用sql語句kill數據庫進程 USE master go DECLARE @Sql NVARCHAR(max) SET @Sql='' select @Sql=@Sql+'kill '+cast(spid as varchar(50))+';' from sys.sysprocesses where dbid=DB_ID('tt') EXEC(@Sql)
6、還原完整備份
數據庫處於正在還原狀態,右鍵數據庫--任務--還原--文件和文件組,選擇最近的一次完整備份。此時,需要在“選項”中選擇第二種還原方式,具體如下圖。
如上圖,勾選完整數據備份文件。
如上圖,恢復狀態選擇第二種,從字面意思就知道為什么要選擇這種。
7、接着還原備份的事務日志
完整備份還原完畢,接着要對事務日志進行還原,右鍵數據庫--任務--還原--事務日志,如下圖:
還原事務日志的時候需要特別注意“時間點”這個設置,其他不需要設置。
時間點選擇為誤刪數據的時間點之前就可以恢復出誤刪的數據,所以之前強調要查看一下時間。如下圖所示
點擊確定,在確定等待還原成功,數據庫變成可用狀態。此時后再查詢,如下圖:
如果查詢發現數據不是你想要的,那么可以重復上述的操作,從備份事務日志開始,然后最后選擇時間點的時候在縮小范圍。
以上,完整的演示了個人在恢復數據過程中的總結。當然前提是允許這樣干,當然大型電子商務系統、高並發系統應該不適用,肯定也不會出現誤刪數據的情況,都有對應的解決方案避免此類情況發生。