SQL2005誤刪除資料的恢復方法

iSQlServer發表於2010-01-28

  由於同事寫錯作業指令碼,導致昨天晚上系統當中一張重要表的 大概2萬資料被刪除。早上發現時的情況是,半夜(誤操作之後)備份過資料,昨天的備份已經被新的備份取代而且沒有日誌備份,貌似這個策略不太合理。這個結 果就是,沒有誤操作之前的全庫備份,無法通過RESTORE LOG 來恢復。

  但是備份後沒有清除日誌,這個給恢復留了最後一絲希望。最後只能寄希望於Log Explorer。據我所知的是Log Explorer不支援SQL2005,以前在2000下我還翻譯過他的英文文件,參考http://blog.csdn.net/jinjazz /archive/2008/05/19/2459692.aspx

  通過google,發現最新版的是可以用在SQL2005下的,但是很少有下載,還好有csdn.. http://download.csdn.net/source/467751。

  最終還是順利恢復了這批資料。另外還有兩篇介紹如何使用sql日誌的文章可以參考。

  11.3.5 資料還原到指定時間點的處理示例.sql
  --建立測試資料庫
  CREATE DATABASE Db
  GO
  --對資料庫進行備份
  BACKUP DATABASE Db TO DISK='c:db.bak' WITH FORMAT
  GO
  --建立測試表
  CREATE TABLE Db.dbo.TB_test(ID int)
  --延時1秒鐘,再進行後面的操作(這是由於SQL Server的時間精度最大為百分之三秒,不延時的話,可能會導致還原到時間點的操作失敗)
  WAITFOR DELAY '00:00:01'
  GO
  --假設我們現在誤操作刪除了 Db.dbo.TB_test 這個表
  DROP TABLE Db.dbo.TB_test
  --儲存刪除表的時間
  SELECT dt=GETDATE() INTO #
  GO
  --在刪除操作後,發現不應該刪除表 Db.dbo.TB_test
  --下面演示瞭如何恢復這個誤刪除的表 Db.dbo.TB_test
  --首先,備份事務日誌(使用事務日誌才能還原到指定的時間點)
  BACKUP LOG Db TO DISK='c:db_log.bak' WITH FORMAT
  GO
  --接下來,我們要先還原完全備份(還原日誌必須在還原完全備份的基礎上進行)
  RESTORE DATABASE Db FROM DISK='c:db.bak' WITH REPLACE,NORECOVERY
  GO
  --將事務日誌還原到刪除操作前(這裡的時間對應上面的刪除時間,並比刪除時間略早
  DECLARE @dt datetime
  SELECT @dt=DATEADD(ms,-20,dt) FROM # --獲取比表被刪除的時間略早的時間
  RESTORE LOG Db FROM DISK='c:db_log.bak' WITH RECOVERY,STOPAT=@dt
  GO
  --查詢一下,看錶是否恢復
  SELECT * FROM Db.dbo.TB_test
  /*--結果:
  ID
  -----------
  (所影響的行數為 0 行)
  --*/
  --測試成功
  GO
  --最後刪除我們做的測試環境
  DROP DATABASE Db
  DROP TABLE #

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-626233/,如需轉載,請註明出處,否則將追究法律責任。

相關文章