正确的程序,以防止回滚的spid

今天,我有一种情况,我想取消一个表和多个索引的更新,并立即从备份恢复数据库。

我发出了kill命令来杀死更新的SPID。 然后,我发出了一个有状态的杀戮,有几万秒的等待回滚。 我需要急着恢复数据库(因此不用担心回滚) – 但是你不能杀死一个回滚的SPID(据我所知),或者恢复一个拥有优秀连接的数据库。

我决定停止sql服务,删除数据库的mdf和ldf物理文件,启动sql服务 – 显示数据库处于可疑状态。 然后恢复数据库。

有没有一个更加控制/合理的方式来处理这种情况?

正确 – 你不能杀死一个正在回滚的SPID,因为数据库将被置于事务不一致的状态(甚至可能在结构上不一致)。

所以简单的答案是,一旦启动SPID,就无法阻止SPID回滚,除非做些激烈的事情。

你的情况很难摆脱,因为没有select。 即使你反弹SQL Server,数据库也会经历崩溃恢复,你需要等到它完成。

解决这个问题的几种可能的方法

  1. 改变更新,使其发生在较小的批次,以便将来没有相同的怪物回滚(可能说起来容易得多)
  2. 以不同的名称恢复数据库。 等待回滚完成,然后删除原始数据库并重命名已恢复的数据库。
  3. 你做了什么。 这样做的巨大风险是你的备份已经损坏,然后你就失去了一切,或者出现了一些其他奇怪的问题,而且你处于比以前更糟糕的状态。 它还要求SQL服务停止重新启动。

一旦处于该状态,基本上没有好的解决scheme,只能让回滚完成。 我真的不愿意宽恕你所做的事情,因为有那么多没有经验的人可能会尝试并深入到自己的深处。

谢谢

我想你是以最有效的方式做到的,但是我可能已经重命名了文件而不是删除它们,以防万一。 或将它们移动到另一个存储位置。