我错误地从远程SQL Server 2008表中删除了大约2,000,000条记录。服务器未授予我访问服务器端备份文件的权限。

有什么办法找回这些记录吗?

评论

您上次测试备份是什么时候?

您上次测试备份的还原是什么时候?

#1 楼

您的数据库是否处于完全恢复模式?



如果是,是否要进行事务日志备份?


如果是,是否有像Quest LiteSpeed这样的备份实用程序,Red Gate SQL Backup或Idera SQLSafe?我可以在这里做。请与供应商联系以获取指示。
如果否,请使用其他名称将完整的备份和事务日志还原为数据库。 (不要覆盖现有数据库。)在删除发生之前,您将可以获得对象的最新副本,但是您需要使用restore命令的stopat部分来指定何时停止恢复命令。您需要先停止操作,然后再进行删除。


如果没有,请获取Quest LiteSpeed或Apex SQL Log之类的日志读取器实用程序的副本。这些实用程序可以连接到数据库服务器,检查日志文件,并帮助您撤消事务。我不确定演示版本是否可以使用,但是付费版本肯定可以使用。


如果没有,请使用以下方法将最后一个完整备份还原为数据库:一个不同的名字。 (不要覆盖您已经拥有的数据库。)从那里,您将能够还原备份时联机的任何记录,但此后您将丢失所有更改。


评论


很好的答案,我要补充一点,如果您具有审核或变更跟踪功能,那么通常只在受影响的一个表中才最容易从那些表中取回数据。当然,如果您对上述部分或全部答案是否定的,请在尽可能多地还原记录后,再修复备份过程,并确定谁可以访问生产数据。

–HLGEM
2012-03-20 18:37

如果您处于简单模式,则某些页面上实际仍可能存在这些行。也许其中一些可以恢复(花费非常高的时间和/或金钱成本)。

–usr
2013年9月30日15:52

仅供参考。 ApexSQL Recover除了时间限制外,评估版还可以恢复的可用总行中的每10行中仅恢复1行(apexsql.com/faqs/faqs_recover.aspx)

– Sameer Alibhai
14年11月18日在22:17

#2 楼

SQL Server为每个删除的记录保留日志。您可以通过fn_dblog SQL Server函数查询这些日志。
SELECT [RowLog Contents 0] 
FROM   sys.fn_dblog(NULL, NULL) 
WHERE  
       AllocUnitName = 'dbo.TableName'        
   AND Context IN ( 'LCX_MARK_AS_GHOST', 'LCX_HEAP' )        
   AND Operation in ( 'LOP_DELETE_ROWS' )   
;

但是此日志为十六进制格式,因此您需要将此十六进制格式转换为实际数据。
下面的文章将对您有所帮助您可以按照上面定义的方式恢复已删除的记录:
如何从SQL Server恢复已删除的数据

评论


这很酷。这种方法在什么条件下有效(或无效)?

–尼克·查玛斯(Nick Chammas)
2011-11-23 17:16

@NickChammas-它只能恢复活动日志中的内容,因此对于简单的恢复模型,一定不会出现检查点。此外,当前看起来它在具有快照隔离的数据库中无法正常工作,但这应该很容易解决。 @ user1059637-您对人们向您的代码添加功能的态度如何?

–马丁·史密斯
2011年11月24日13:27

@MartinSmith,现在它也可以完美地与快照隔离一起使用。

–user1059637
11年11月29日在7:36

#3 楼

不幸的是,如果没有更多信息,我们将无法为您提供帮助。但是从您的问题来看,我发现您已经从数据库中删除了似乎是200万条记录的记录。除非您已完全登录数据库并购买了一些非常特定的工具,否则很可能无法恢复此信息。

如果您可以更详细地描述您认为的内容,完成,以及为什么感觉无法收回记录并可以描述数据库的组织,那么我们可能会为您提供更多帮助。

一些一般性建议:如果您认为自己已经删除了200万条记录,您现在可能有点害怕。因此,您应该休息五分钟,冷静下来,然后重新检查问题。另外,您应该立即告诉老板是否合理(不要凌晨2点叫醒别人来告诉他们),并且您正在研究解决方案。最好是承认发生了什么,而不是疯狂地尝试恢复并可能使情况变得更糟并隐藏细节。知道老板可以以某种方式帮助您,可以帮助您解决问题。就像我说的,只是一些一般性建议。

评论


休息5分钟是个好主意。一直有效。有助于集中精力。 :-) 去过也做过。

– John K. N.
2012年11月19日15:29