当将SQL Server数据库脱机时,出现极长的等待时间

300

我试图对我的开发数据库进行离线维护(从实时备份恢复),但是SQL Server Management Studio的“下线”命令速度极慢,目前已经超过30分钟。我快要崩溃了,似乎找不到任何在线参考来解决速度问题。

一些网站建议说,打开的数据库连接会导致此减速,但是使用此数据库的唯一应用程序是我的开发机器的IIS实例,并且服务已停止-没有更多的打开连接。

是什么原因导致这种减速,我该怎么做才能加快它?

18个回答

449

在进一步搜索之后(由于gbn的回答和u07ch对KMike答案的评论,我得到了新的搜索词),我找到了这个,在2秒内成功完成:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(更新)

如果出现以下错误,你可以根据这篇博客文章的启示来修复它:

由于无法在数据库'数据库名'上放置锁定,因此ALTER DATABASE操作失败。请稍后重试。

你可以运行以下命令来查找是哪个进程正在锁定你的数据库:

EXEC sp_who2

并使用以下命令中找到的任何SPID

KILL <SPID>

然后再运行ALTER DATABASE命令,现在应该可以正常工作了。


35
如果无法生效(锁定未能成功),请尝试此链接中的解决方法:https://dev59.com/6G445IYBdhLWcg3w1tmi。 - nalply
3
如果“下线数据库”进程仍在运行,对于开发机器,您可以从任务管理器中终止它,然后运行上述命令。 - Null Head
1
如果您运行KILL命令并收到“无法使用KILL命令杀死自己的进程”消息,请确保使用主数据库来运行该命令。 - Jarrod
真正让人烦恼的是,99%的情况下,允许连接阻止数据库脱机是不需要的行为。当我想要数据库脱机时,我希望任何连接都被切断。 - EvilSnack

133

很可能有某个地方与数据库存在连接(罕见的例子:异步统计更新

要查找连接,请使用sys.sysprocesses

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')

为了强制断开连接,请使用ROLLBACK IMMEDIATE

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

8
+1是因为"process query"功能可以让你知道谁连接了这个数据库。在我的情况中,是一个恶意员工正在使用SSMS进行连接 :) - MikeMurko
3
我的情况是,我是一个打开了查询分析器窗口的流氓程序。 - dellyjm
1
在我的案例中,开发人员为一家非常知名的银行建立了一个生产主网站,该网站指向一个标记为OLD的数据库。 - ZZ9
4
如果出现“由于无法在数据库上放置锁定,ALTER DATABASE 失败”的情况,可以使用命令“KILL <SPID>”来解决。 - Muflix

32

您有任何已连接到此数据库的开放SQL Server Management Studio窗口吗?

将其置于单用户模式,然后再次尝试。


3
将数据库 <DBNAME> 设置为单用户模式,并立即回滚当前所有未完成的事务。 - u07ch
KMike - 我唯一连接的是Master数据库,而不是我要下线的数据库。 - Erik Forbes

17

在我的情况下,等待太久没有耐心,直接关闭了管理工具。退出之前,它显示了成功消息,并使数据库脱机。文件可供重命名。


7

执行存储过程 sp_who2。

这将允许您查看是否有任何阻塞锁定。杀掉它们可以解决问题。


5

在SSMS中:右键单击SQL服务器图标,选择“活动监视器”,打开“进程”选项卡。找到已连接的进程,右键单击该进程,选择“终止”。


5
在执行此操作之前,我查看了数据库中的一些表。我的用户帐户在 SSMS 中持有与此数据库的活动连接。一旦我断开了 SSMS 中与服务器的连接(并保留“将数据库脱机”对话框),该操作就成功了。

和我一样。然后我重新连接,将活动数据库更改为master并运行以下命令:ALTER DATABASE XXX SET OFFLINE WITH ROLLBACK IMMEDIATE - cskwg

4
任何时候遇到这种情况,你都应该想到你的事务日志。带有ROLLBACK IMMEDIATE的ALTER DB语句表明了这一点。看看这个链接:http://msdn.microsoft.com/en-us/library/ms189085.aspx。加强对检查点等的理解。你需要决定是否值得保存日志中的事务,然后相应地选择运行数据库的模式。你不必等待,也没有理由丢失数据——两者都可以兼得。

2
明智的建议 - 谢谢 - 但在这种情况下,数据是可替换的,因为它是要恢复的开发数据库。 - Erik Forbes

3
此外,请关闭任何与所涉及数据库连接的查询窗口 ;)

3
关闭发出请求的SSMS(SQL Service Manager)实例解决了我的问题......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接