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

 

原理与实现要点:


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

以下为测试语句

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值