递延交易

在SQL Server 2005 Enterprise Edition和更高版本中,如果回滚(撤消)所需的数据在数据库启动期间处于脱机状态,则损坏的事务可能会延迟。延迟事务是指在前滚阶段结束时未提交的事务,并且该事务遇到了阻止其回滚的错误。因为事务无法回滚,所以它被延迟。

注释

损坏的事务仅在SQL Server 2005 Enterprise Edition和更高版本中延迟。在SQL Server的其他版本中,损坏的事务会导致启动失败。

通常,发生延迟事务是因为在数据库前滚时,I/O错误阻止读取事务所需的页面。然而,文件级别的错误也可能导致延迟事务。当部分还原序列在需要回滚事务且事务需要脱机数据时停止时,也可能会发生延迟事务。

正在回滚并遇到I/O错误的用户事务会导致整个数据库脱机。当数据库重新联机时,重做会重新获取它拥有的所有锁,并尝试回滚所有未提交的事务。事务修改的所有数据都将保持适当锁定,直到事务可以回滚。无法回滚的事务将在修复损坏并重新启动数据库时放弃锁定,或者在联机还原后,在解决延迟事务的同时数据库保持联机时放弃锁定。在此之前,延迟事务可以持有锁,以防止对整个数据库进行某些操作。例如,如果延迟事务包含CREATE TABLE指令,则在解析延迟事务之前,任何用户都无法创建表。

延迟事务也可能发生,因为逐段还原会将数据库恢复到一个或多个活动事务影响尚未还原且处于脱机状态的文件组的程度。因为事务无法回滚,所以它们被延迟。

下表列出了导致数据库执行恢复的操作以及发生I/O问题时的结果。

行动

解决方案(如果发生I/O问题或所需数据处于脱机状态)

服务器启动

递延交易

恢复

递延交易

附加

附加失败

自动重新启动

递延交易

创建数据库或数据库快照

创建失败

恢复数据库镜像

递延交易

文件组处于脱机状态

递延交易

将事务移出DEFERRED状态

重要

延迟的事务使事务日志保持活动状态。包含任何延迟事务的虚拟日志文件在这些事务移出延迟状态之前不能被截断。有关日志截断的更多信息,请参阅事务日志截断.

要将事务移出延迟状态,数据库必须在没有任何I/O错误的情况下干净地启动。如果存在延迟事务,则必须修复I/O错误的来源。可用的解决方案按其通常尝试的顺序列出如下:

  • 重新启动数据库。如果问题是暂时的,那么数据库应该在没有延迟事务的情况下启动。

  • 如果事务因文件组脱机而延迟,请使文件组重新联机。

    若要使脱机文件组重新联机,请使用以下Transact-SQL语句:

    RESTORE DATABASE数据库名称FILEGROUP=<文件组名称>
  • 还原数据库。在线恢复后,将解决所有延迟的事务。

    在完全恢复或批量恢复模式下,如果延迟的事务仅由少数损坏的页面引起,则在线页面恢复可能会解决这些错误(如果支持)。

  • 如果您不再需要脱机状态导致延迟事务的文件组,请使脱机文件组失效。由于文件组脱机而延迟的事务将在文件组失效后移出延迟状态。

    重要

    无法恢复失效的文件组。

    有关更多信息,请参阅默认文件组.

  • 如果事务因页面错误而延迟,并且数据库的良好备份不存在,请使用以下过程修复数据库:

    • 首先通过执行以下Transact-SQL语句将数据库置于紧急模式:

      ALTER DATABASE设置紧急

      有关紧急模式的信息,请参阅数据库状态.

    • 然后,使用以下DBCC语句之一中的DBCC repair_ALLOW_DATA_LOSS选项修复数据库:DBCC检查DB,DBCC检查分配,或DBCC检查表.

      当DBCC遇到坏页时,DBCC会释放它并修复任何相关错误。这种方法使数据库能够以物理一致的状态恢复在线。然而,其他数据也可能丢失;因此,这种方法应该作为最后的手段。