延迟事务 (SQL Server)

在 SQL Server Enterprise 中,如果回滚(撤消)所需的数据在数据库启动期间处于脱机状态,则损坏的事务可能会延迟。 延迟事务是在前滚阶段完成时仍未提交,并遇到阻止其回滚的错误的事务。 因为事务无法回滚,所以被推迟。

注释

仅在 SQL Server Enterprise 中,损坏的事务会被延期处理。 在其他版本的 SQL Server 中,损坏的事务会导致启动失败。

通常,延迟事务发生的原因是,当数据库向前滚动时,I/O 错误阻止读取事务所需的页面。 但是,文件级别的错误也可能导致延迟事务。 当部分还原序列在一个需要进行事务回滚的时间点停止,并且事务需要离线数据时,延迟事务处理也可能发生。

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

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

下表列出了引发数据库执行恢复操作的动作,以及当出现 I/O 问题时的结果。

行动 解决方法(如果出现 I/O 问题或所需数据处于脱机状态)
服务器启动 延期事务
还原 延迟交易
附上 附件失败
自动启动 递延交易
创建数据库或数据库快照 创建失败
在数据库镜像上重做 延期处理
文件组处于脱机状态 延期交易

将事务移出延迟状态

重要

延迟事务使事务日志保持活动状态。 在将这些事务移出延迟状态之前,无法截断包含任何延迟事务的虚拟日志文件。 有关日志截断的详细信息,请参阅事务日志(SQL Server)。

若要将事务移出延迟状态,数据库必须完全启动,而不会发生任何 I/O 错误。 如果存在延迟的事务,则必须修复 I/O 错误的源。 可用解决方案按通常尝试的顺序列出,如下所示:

  • 重启数据库。 如果问题是暂时性的,数据库应启动而不延迟事务。

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

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

    RESTORE DATABASE database_name FILEGROUP=<filegroup_name>  
    
  • 还原数据库。 联机还原后,延期的事务将被解析。

    在完整或批量日志恢复模型下,如果延迟事务仅由几个损坏的页面引起,则在线页面恢复可能会解决这些错误(如果支持的话)。

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

    重要

    永远无法恢复已失效的文件组。

    有关详细信息,请参阅“删除已解除的文件组”(SQL Server)。

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

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

      ALTER DATABASE <database_name> SET EMERGENCY  
      

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

    • 然后,使用以下 DBCC 语句之一中的 DBCC REPAIR_ALLOW_DATA_LOSS 选项修复数据库: DBCC CHECKDBDBCC CHECKALLOCDBCC CHECKTABLE

      当 DBCC 遇到错误页时,DBCC 会解除分配并修复任何相关的错误。 此方法使数据库能够以物理一致状态重新联机。 但是,其他数据也可能丢失;因此,此方法应用作最后手段。

另请参阅

还原和恢复概述 (SQL Server)
删除已解除的文件组 (SQL Server)
文件还原(完整恢复模式)
文件还原 (简单恢复模式)
还原页(SQL Server)
碎片还原 (SQL Server)
ALTER DATABASE (Transact-SQL)
RESTORE (Transact-SQL)