程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 恢復SQL2005誤刪除的數據

恢復SQL2005誤刪除的數據

編輯:關於SqlServer

由於同事寫錯作業腳本,導致昨天晚上系統當中一張重要表的大概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 #

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved