从事务日志里恢复被删的SQL数据

Recover deleted SQL data from a backup or from online database files, 文章里,我们展示了两个恢复场景,一个是完整数据库备份,另一个是在线数据库文件文件-MDF文件。

除了这些,当您遇到需要SQL 数据恢复的时候有一个提供更多资源的东西- 事务日志
在SQL Server数据库里面每个架构和数据的变更都会被添加到联机事务日志里作为一条日志记录。如果您想回滚删除记录的事务,并且这个事务在一个联机事务日志、分离的事务日志文件或事务日志备份里,您可以读取它们并回滚删除操作。

如果您的数据库处于:

  • 完整恢复模式,delete事务依然在联机事务日志或事务日志备份里(这个事务日志备份是在记录删除之后做的备份)。
  • 大容量日志恢复模式,delete事务能够完整记录在联机事务日志里除了被删的BLOB数据。由于删除的BLOB不会记录日志到联机事务日志,BLOB插入由于大容量日志恢复模式也不会被记录日志,所以它们的恢复将是不可能的。对于其他数据类型,删除事务会保存在联机事务日志或者在删除发生后做的日志备份文件里。
  • 简单恢复模式,在删除记录之后会有很多数据库事务在执行,删除事务可能不再在联机事务日志里了。在这种情况下,您越早对数据库运行SQL Server联机事务日志读取器,能成功恢复的机会就越大。

使用 ApexSQL Log

要读取一个数据库的联机事务日志,分离事务日志文件和事务日志备份(不管是压缩还是非压缩),使用 ApexSQL Log. 这是一个 SQL Server事务日志读取器 ,它能审计、转换和重播数据和对象变更包括那些在 ApexSQL Log被安装之前发生的变更。它也可以捕获发生在用户、应用程序和主机上的每个变更信息。

  1. 启动 ApexSQL Log
  2. 连接的记录被删除的那个在线数据库

    Connecting to the database in ApexSQL Log

  3. 如果任何事务日志备份在删除之后才被创建,在下一步里把它们全部添加上。注意事务日志备份必须来自一个完整的日志链,如果您要尝试恢复包含了BLOB的数据(看下面内容获取更多详细信息)
  4. 万一您有一个包含了删除记录的分离的事务日志文件(例如,如果您离线数据库并在删除之后立即拷贝走LDF文件),您也可以使用它:

    Select log data source file

  5. 在过滤设置步骤里使用时间范围部分来收窄事务定位到事务发生的特定时间段

    Filtering transactions by time range

  6. 使用操作过滤器来收窄范围只显示已删除的记录。为了达到这个目的,反选所有的schema operations (DDL),也反选Insert row 和 Update row in the Data operations (DML) 列表

    Choosing deleted SQL records only

  7. 如果可能,指定被删除记录的表。否则,让所有用户表保持勾选状态。

    Specifying the records from which the records have been deleted

  8. 点击“打开”
  9. 所有删除的事务都会显示在主grid窗格。您需要做的就是选择所有的或者您需要的已删除事务,然后在菜单里点击“ Create Undo Script”来创建回滚脚本

    Create Undo Script in ApexSQL Log

  10. 创建一个对于所有显示在gird窗格里记录的回滚脚本,在菜单里点击“ Create undo script”。要只对一些记录创建回滚脚本,在grid窗格里选择它们,并在右键菜单里选择“Create undo script”

    插入被删除记录的脚本将会被创建

    Generated Undo Script

  11. 执行那个脚本,在菜单里点击 Run button 按钮

使用ApexSQL Log 立即创建一个回滚脚本

上面描述的方法把结果显示在grid窗格里只适用于少量的记录。当有上百万的已删除记录,我们建议立刻创建一个回滚脚本,代替将结果显示在gird窗格。步骤1到7跟之前是一样的

  1. 不需要在grid窗格里打开结果集,点击“导出结果到一个文件”

    Export results to a file

  2. 选择“生成回滚(undo)脚本”并指定文件路径和文件名

    Generate Rollback (UNDO) Script

  3. 点击“OK”

    Exporting finished

使用 ApexSQL Recover

这是另一个ApexSQL工具能够读取SQL Server事务日志- 一个联机事务日志、分离的事务日志文件和事务日志备份(不管是压缩的还是非压缩的)。 ApexSQL Recover 是一个SQL Server数据库恢复工具能够恢复删除了的、truncate了的、损坏的或置疑的数据。它能恢复由于drop操作导致的对象和数据丢失
并且能还原被删除的在线BLOB文件。恢复过程是跟这篇文章是非常相似的: Recover deleted SQL data from a backup or from online database files – Use ApexSQL Recover

  1. 启动 ApexSQL Recover
  2. 选择恢复丢失数据由于一个删除操作
  3. 指定SQL Server实例、认证信息和被删除数据的那个数据库
  4. 选择几个对恢复有用的可用资源
  5. 联机事务日志,对于已选数据库的所有事务日志备份和创建的数据库备份都会被自动罗列出来。若要添加额外的事务日志备份或者包含删除记录的已分离的事务日志
    ,使用“添加”按钮。注意事务日志备份必须来自一 个完整的日志链
  6. 指定delete语句执行时的那个时间。如果您并不知道delete语句在什么时候发生的,选择 Date and time are unknown
  7. 如果可能的话,对于指定表可以使用表过滤器来收窄恢复范围
  8. 点击“恢复”
  9. 一个包含了被删记录的insert脚本将会被创建。检查一下它并执行它。

对于已删记录的恢复的好消息是即使没有一个数据库备份或者一个事务日志备份链依然有机会恢复成功。需要注意的是没有一个完整的事务日志链要成功恢复被删的BLOB数据是不可能的。当删除BLOB事务没有被记录实际的被删除值,那么就必须要顺序遍历整个事务日志备份一直到日志链的开头。如果日志链断裂,那么重构可能是不正确的。
例如,如果BLOB数据更新信息丢失了,恢复的将会是原来被插入的BLOB而不是被删除的BLOB。

即使数据库处于简单恢复模式,依然有机会进行数据恢复。在简单恢复模式下,联机事务日志里的新事务会覆盖旧的事务。打个比方如果联机事务日志是100 GB大小,
您每天有1 GB大小的事务日志数据记录,联机事务日志将在100天内完全覆盖。这意味着,您可能要恢复被删数据直到100天之前。

当然,这不是说您应该依赖这个工具而忘记您当初的SQL Server灾难恢复策略。

ApexSQL有两个工具,可以帮助事务日志。 ApexSQL Log 提供了更多的过滤选项和恢复数据的更多保障-另外基于时间和表名的过滤是两个工具的通用特性。
它提供了过滤系统表、基于一个特定的列值的记录,提交delete事务的那个用户的描述信息,一旦事务发生只要ApexSQL Log连接监视器在运行就能收集应用程序名字和主机名

ApexSQL Recover 的过滤选项比较少,但是它提供了恢复输出选项。另外它会创建一个插入记录的T-SQL脚本,它也可以创建一个新数据库并且直接在库上恢复被删记录。

翻译者: 林勇桦

July 2, 2015