如何找回一些已删除的记录?

51 sql-server-2008 sql-server recovery

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

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

Bre*_*zar 122

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

  • 如果是,您是否在进行事务日志备份?

    • 如果是,您是否有像 Quest LiteSpeed、Red Gate SQL Backup 或 Idera SQLSafe 这样的备份实用程序?
      • 如果是,这些实用程序可以从备份文件(包括完整和事务日志)中取消删除对象 - 但解释如何使用这些超出了我在这里可以做的范围。有关说明,请联系供应商。
      • 如果不是,则将完整备份和事务日志还原为具有不同名称的数据库。(不要覆盖现有数据库。)您将能够在删除发生之前获得对象的最新副本,但您需要使用 restore 命令的 stopat 部分来指定何时停止恢复命令。您需要在删除发生之前停止。
    • 如果没有,请获取日志阅读器实用程序的副本,例如 Quest LiteSpeed 或 Apex SQL Log。这些实用程序可以连接到数据库服务器、检查日志文件并帮助您撤消事务。我不确定演示版本是否可以工作,但付费版本肯定可以。
  • 如果否(不在完整恢复模式下),则将上次完整备份还原为具有不同名称的数据库。(不要覆盖您已经拥有的数据库。)从那里,您将能够恢复备份时在线的任何记录,但您将丢失此后的所有更改。

  • 很好的答案,我会补充一点,如果您有审计或更改跟踪,通常最容易从这些表中获取数据,而只有一个表受到影响。当然,如果您对上述部分或全部问题的回答是否定的,在您尽可能多地恢复记录后,然后修复您的备份过程以及可能访问生产数据的人。 (4认同)

小智 31

SQL Server 为每个已删除的记录保留日志。您可以通过fn_dblogSQL 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' )   
;
Run Code Online (Sandbox Code Playgroud)

但是这个日志是十六进制格式的,你需要把这个十六进制格式转换成你的实际数据。

下面的文章将帮助您以上面定义的方式恢复已删除的记录:

如何从 SQL Server 恢复已删除的数据

  • 这很酷。这种方法在什么条件下起作用(或不起作用)? (3认同)
  • @NickChammas - 它只能恢复活动日志中的内容,因此对于简单恢复模型,一定不会发生检查点。此外,目前看起来它在具有快照隔离的数据库中无法正常工作,但这应该是一个简单的修复。`@user1059637` - 你对人们向你的代码添加功能的态度是什么? (3认同)

jco*_*and 23

不幸的是,如果没有更多信息,我们将无法为您提供帮助。但是从您的问题中,我看到您已从数据库中删除了似乎是 200 万条记录。您很可能无法恢复这些信息,除非您对数据库进行了完整的登录并购买了一些非常具体的工具。

如果你能更详细地描述你认为你做了什么,为什么你觉得你无法取回记录,并且能描述你的数据库的组织,那么我们可能会更多地帮助你。

一些一般性建议:如果您认为您已经删除了 200 万条记录,那么您现在可能有点害怕。所以你应该休息五分钟,冷静下来,重新审视这个问题。此外,如果这样做合理(不要在凌晨 2 点叫醒某人告诉他们)并且您正在制定解决方案,您应该立即告诉您的老板。与其疯狂地试图恢复并可能使事情变得更糟并隐藏细节,不如承认发生的事情。知道你的老板可以以某种方式提供帮助,可以帮助你解决问题。就像我说的,只是一些一般性建议。

  • 5 分钟的休息时间是个好主意。总是有效。有助于集中注意力。:-) 去过也做过。 (11认同)