【SQL Server】本地备份和还原(事物日志还原)
之前对备份和还原的理解仅限于:定时备份,然后恢复到上次备份这样的基础——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。而我们希望恢复数据形式如下:
这里,我们看到了误操作的时间。
数据库恢复
具体恢复步骤如下:、
完成事物日志备份(非常重要)
右击数据库,选择事物日志备份。
注意,在日志选项中,一定要选择“被封日志尾部,并使得数据库处于还原状态”(关键步骤)。
设置数据库为单访问模式,并杀死其他进程
右击数据库属性,设置为单用户访问。
如果发现备份不了可以用下面语句查看,并把spid杀掉:
SELECT * FROM sys.sysprocesses WHERE dbid=DB_ID('SQLTestDB')
杀掉spid脚本
KILL spid
还原数据到合适的时间点前
接下来,要选择误操作(删除)前面一点儿的时间,确保数据库损失最小。
完成后,可以恢复数据库多用户模式。
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。