原理与实现要点:
假设出问题的数据库为A, 新恢复后的数据库为B
1.前提:A数据库的恢复模式必须为:完整。
2.备份A数据库的日志,假设文件名为log.bak
3.使用A数据库的最近的完整备份,使用 WITH NORECOVERY 的方式,恢复为B数据库
4.使用恢复日志的方式,指定还原的时间点(T),将Log.bak文件还原到B数据库,完成后,B数据库的内容即是T时间之前的完整数据。
--创建A数据库
CREATE DATABASE A
GO
--对A数据库进行备份
BACKUP DATABASE A TO DISK= 'c:\A.bak ' WITH FORMAT
GO
--创建测试表
CREATE TABLE A.dbo.TB_test(ID int)
GO
--插入数据
Insert Into A.dbo.TB_test(ID)
select 1
GO
--延时1秒钟,再进行后面的操作
--(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
WAITFOR DELAY '00:00:01 '
GO
--假设我们现在误操作删除了 A.dbo.TB_test 这个表
DROP TABLE A.dbo.TB_test
--为了测试还原时间点,先记录操作的时间点
SELECT dt=GETDATE() INTO #T
GO
--在删除操作后,发现不应该删除表 TB_test
--下面演示了如何恢复这个误删除的表 TB_test,以及数据行
--为了避免覆盖A数据库,恢复时,生成到B数据库
GO
--首先,备份A数据库的事务日志(使用事务日志才能还原到指定的时间点)
BACKUP LOG A TO DISK= 'c:\A_log.bak ' WITH FORMAT
GO
--接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行),生成数据库B
RESTORE DATABASE B FROM DISK= 'c:\A.bak '
WITH FILE = 1, MOVE N'A' TO N'C:\B.mdf',
MOVE N'A_log' TO N'C:\B.ldf', NORECOVERY, REPLACE
GO
--将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
DECLARE @dt datetime
SELECT @dt=DATEADD(ms,-20,dt) FROM #T --获取比表被删除的时间略早的时间
RESTORE LOG B FROM DISK= 'c:\A_log.bak ' WITH RECOVERY,STOPAT=@dt
GO
--查询一下,看表是否恢复
SELECT * FROM B.dbo.TB_test
--最后删除我们做的测试环境
DROP DATABASE A
DROP DATABASE B
DROP TABLE #T
以下为测试语句