之前對備份和還原的理解僅限於。定時備份,然後恢復到上次備份這樣的基礎——https://www.cnblogs.com/luyj00436/p/18360825 。這樣,上次備份到這次誤操作,資料就損失了。現在有以下測試資料:
SELECT * FROM SQLTest
完成這些後,進行備份(完整備份)。
接下來,我們進行日常的操作和誤操作。
---- 正常操作
INSERT INTO SQLTest(ID,c1) VALUES (6,'test6')
INSERT INTO SQLTest(ID,c1) VALUES (7,'test7')
INSERT INTO SQLTest(ID,c1) VALUES (8,'test8')
INSERT INTO SQLTest(ID,c1) VALUES (9,'test9')
INSERT INTO SQLTest(ID,c1) VALUES (10,'test10')
-- 正常操作前資料
SELECT *
FROM SQLTest
WAITFOR DELAY '00:00:01'; -- 延時1s
-- 誤操作
SELECT GETDATE() AS '誤操作前的時間' -- 2024-08-16 10:58:33.370
WAITFOR DELAY '00:00:01'; -- 延時1s
DELETE SQLTest
SELECT GETDATE() AS '誤操作後的時間' -- 2024-08-16 10:58:34.387
SELECT * FROM SQLTest
此時,資料表 SQLTest 已經為空。如果直接還原,資料庫恢復為上圖所示,最大ID為9。而我們希望恢復資料形式如下:
這裡,我們看到了誤操作的時間。
資料庫恢復
具體恢復步驟如下:、
1. 完成事物日誌備份。
2.設定資料庫為單訪問模式,並殺死其他程序。
3. 還原資料到合適的時間點前。
完成事物日誌備份(非常重要)
右擊資料庫,選擇事物日誌備份。
注意,在日誌選項中,一定要選擇“被封日誌尾部,並使得資料庫處於還原狀態”(關鍵步驟)。
設定資料庫為單訪問模式,並殺死其他程序
右擊資料庫屬性,設定為單使用者訪問。
如果發現備份不了可以用下面語句檢視,並把spid殺掉:
SELECT * FROM sys.sysprocesses WHERE dbid=DB_ID('SQLTestDB')
殺掉spid指令碼
KILL spid
還原資料到合適的時間點前
接下來,要選擇誤操作(刪除)前面一點兒的時間,確保資料庫損失最小。
完成後,可以恢復資料庫多使用者模式。