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