sp_dboption2 错误 6106

sp_dboption2 错误 6106

我使用存储过程 sp_dboption2 (http://vyaskn.tripod.com/code/sp_dboption2.txt) 关闭与数据库的所有连接,以便我可以将其恢复为刷新测试服务器 (SQL 2005) 的一部分。它已经完美地运行了几年,但在过去的几周里,我使用它的两次都失败了。输出如下所示:

SPID 55: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds. [SQLSTATE 01000]
SPID 56: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds. [SQLSTATE 01000]
SPID 55: transaction rollback in progress. Estimated rollback completion: 0%. Estimated time remaining: 0 seconds. [SQLSTATE 01000]
Msg 6106, Sev 16, State 1, Line 1 : Process ID 56 is not an active process ID. [SQLSTATE 42000]

该过程基本上循环遍历 sysprocesses 中的 spid 并将它们杀死,直到没有剩余的 spid。从上面看,两次杀死同一个 spid 似乎没有问题。看起来更像是 spid 56 在第一次 KILL 时启动了回滚,然后仍然在 sysprocesses 中,因此发出了第二次 KILL,但在回滚完成和 spid 消失之间,导致第二次 KILL 失败。我想不出最近发生了什么变化会影响这一点 - 没有安装 SQL 更新等。

现在我将尝试将 KILL 包装在 try...catch 中并忽略错误 6106。其他人遇到过这个问题吗?您知道发生了什么事导致这个问题吗?您是如何解决的?有没有更现代的方法将所有用户踢出以进行恢复?

答案1

尝试这个

修改数据库[数据库名称]

设置受限用户

--设置多用户

立即回滚

它将使数据库处于受限用户模式,这意味着只有 db_owner、dbcreator 或 sysadmin 角色的成员可以使用该数据库。

此外,“WITH ROLLBACK IMMEDIATE”子句将导致在将数据库置于受限用户模式之前终止与数据库的所有连接。

这在 SQL 2005 和 SQL 2008 中应该可以正常工作。然后,您可以执行必要的操作并运行带有“MULTI_USER”子句的命令以使其再次可用。

更多信息请访问:http://msdn.microsoft.com/en-us/library/bb522682.aspx

希望这可以帮助。

相关内容