回滚需要永远

yvr*_*238 4 sql-server

问题:我正在将 3TB 表上的非聚集索引从一个文件组移动到另一个文件组(用户文件组到索引),它花了 11 个小时但从未完成,我不得不终止该进程,因为它阻塞了其他进程。

回滚需要永远。我杀了这个过程已经 10 个小时了,不知道发生了什么。锁仍然被持有并且正在影响其他进程。

我看到百分比完成为 0% 并且在这么多小时后用 statusonly 杀死也显示为 0%。

您能否建议我是否有办法检查回滚是否仍在执行任何操作或只是卡住了。我害怕重新启动服务器,因为它无论如何都必须经过回滚过程。

在 sp_who2 diskIO 下为这个 SPID 移动的唯一积极的事情。

****任何帮助深表感谢....****

Bre*_*zar 11

坏消息:SQL Server 中的前滚工作是多线程的,但回滚是单线程的。如果您有许多内核工作 11 个小时,则完全有可能需要数十个小时(或几天)来进行回滚。

尝试使用sp_BlitzFirst @ExpertMode = 1(免责声明:我是该开源工具的作者之一),并查看文件统计信息部分。它将显示在该时间跨度内哪些数据和日志文件进行了物理读取和写入。这将显示您的回滚是否继续进行。

您提到了“影响其他进程” - 请记住,服务器上运行的其他进程可能会降低您的回滚速度。您可能还需要注意驱动器可用空间和事务日志大小。您的事务是一个记录操作,并且即使在您进行了日志备份之后,SQL Server 仍需要该事务日志保持在线。很可能会在回滚期间耗尽驱动器空间。

考虑到回滚有多大,并且根据您的 RPO/RTO 目标,我会考虑故障转移到您的灾难恢复服务器或从备份中恢复。我现在不想教你,但现在是学习教训的好时机,你应该首先在开发环境中尝试一切,以衡量需要多长时间。您本来可以更好地确定如果没有大量计划,就无法将多 TB 的对象从一个文件组移动到另一个文件组。