卡在管理工作室中的任务,您如何处理?


13

在Management Studio中单击“使数据库脱机”后,此消息将保持挂起状态,如果单击“关闭”,则不会关闭。

https://i.imgur.com/KD6AROv.png

在Management Studio中处理此类卡住工作的好方法是什么?您可以通过活动监视器将其杀死吗?我是否应该寻找阻止该工作进行并终止的过程?


4
首先找出阻止它的原因。您可以从sys.dm_exec_requests获得此信息。另外,您的工作可以以不会被阻塞的方式来执行此操作,例如,通过ALTER DATABASE foo SET SINGLE_USER WITH ROLLBACK IMMEDIATE;先发出...否则,它只能坐下来等待,对于繁忙的数据库,这可能是永远的。
亚伦·伯特兰

将数据库设置为single_user解决了该问题,我应该已经猜到了……SQLserver始终需要single_user来进行此类操作。
A_V

Answers:


13

我会说永远不要在GUI中使用“脱机”功能,除非您知道数据库未被使用的事实。随便什么。不做一些繁琐的工作就很难知道,那么为什么不把这个脚本保存在某个地方并一直使用呢?

USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;

然后是对等的:

ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;

您需要将其设置为“ SINGLE_USER首先”的原因是将任何现有用户踢出去(在分离对话框中可以选择这样做,但是在“脱机”对话框中没有此选项),因为SQL Server需要对数据库的独占访问权才能执行它离线。现在,您可能仍要做一些额外的工作来查看谁当前正在使用数据库,就像您是在大型备份操作或ETL作业或您拥有的内容中进行此操作一样,这可能会出现问题。

编辑:我已经在Connect上对此提出了建议(请参阅Connect#2687832),并且也将其发布到了Trello(在“对象资源管理器”下归档)。


而且,如果设置单个用户也因为无法获得数据库锁定而失败,该怎么办?
StackOverthrow

@ user560822您将必须等到可以锁定数据库为止。如果那意味着您必须开始杀死会话……
亚伦·贝特朗

9

当您已经处于挂起状态时,请不要忘记您可以使用以下命令搜索整个服务器上的打开连接

sp_who2  

在另一个数据库中,例如master。
扫描结果以查找您要使数据库脱机的任何位置。
注意这些行的spid(进程ID)列值。

一次运行

kill  ##

其中“ ##”是spid。

当然,要确保这些进程对于保持运行状态并不重要...它们将在没有完成最新命令且没有任何警告的情况下终止。


1
被接受的答案对我来说没有用。第一条命令失败。这个答案很完美。谢谢
Cheburek '19

很好:)是的,接受的答案实际上是为了避免问题……如果您已经被绞死,则需要类似的方法来杀死它
Mike M
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.