天天看点

恢复SQL Server被误删除的数据(再扩展)

大家对本人之前的文章《恢复SQL Server被误删除的数据》 反应非常热烈,但是文章里的存储过程不能实现对备份出来的日志备份里所删数据的恢复

这个是一个缺陷,本人决定对这个存储过程扩展一下,支持对log backup文件里的delete语句进行恢复

实验步骤

1、首先先准备好测试表和测试语句

2、删除数据之后对数据库进行日志备份

4、建立存储过程

恢复SQL Server被误删除的数据(再扩展)
恢复SQL Server被误删除的数据(再扩展)

View Code

5、在C盘看到备份出来的日志备份文件

恢复SQL Server被误删除的数据(再扩展)

6、存储过程的两种调用方式

可以看到被误删的那条数据.

恢复SQL Server被误删除的数据(再扩展)

为什麽要扩展这个存储过程

恢复SQL Server被误删除的数据(再扩展)

因为进行了日志备份之后,原先的delete语句的log record可能已经不存在于ldf文件里面,这时候要恢复被那条delete语句删除的数据就需要读取

log backup文件里面的log record来进行恢复

对比图

Recover_Deleted_Data_Proc

恢复SQL Server被误删除的数据(再扩展)

Recover_Deleted_Data_BylogBackup_Proc

恢复SQL Server被误删除的数据(再扩展)

因为很多公司为了数据安全,一般会对数据库半个小时或者15分钟做一次日志备份,目的是做日志传送或者及时把数据库备份拷走

考虑到这种情况,本人决定扩展一下这个存储过程,其实原理也很简单,就是把fn_dblog函数替换为fn_dump_dblog函数

在文章《恢复SQL Server被误删除的数据》发布之后,有很多人通过QQ咨询我,为什麽执行了你的存储过程之后会显示

There is no data in the log as per the search criteria

我发现原因基本上有两个:

(1)数据库从来没有做过完整备份

(2)因为数据库实例下有一个job定时对数据库做日志备份,误删除了数据之后(误执行delete语句之后),刚好那个job到达运行时间,对数据库进行了日志备份

对于第一种情况,可以参考本人写的这篇文章《您真的理解了SQLSERVER的日志链了吗?》,文章里面有解释

对于第二种情况,可以使用本篇文章的方法,回想一下delete语句的执行时间,然后指定日志备份的备份文件进行恢复

恢复SQL Server被误删除的数据(再扩展)

如有不对的地方,欢迎大家拍砖o(∩_∩)o 

本文版权归作者所有,未经作者同意不得转载。

继续阅读