您的位置:首页 > 数据库

如何从数据库的完整日志模式还原误删除的数据 .

2011-12-23 15:20 507 查看
原理与实现要点:

假设出问题的数据库为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

以下为测试语句

view plaincopy to clipboardprint?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐