在管理工作室中单击“使数据库脱机”后,如果单击关闭,此消息将保持挂起并且不会关闭。
在管理工作室处理此类卡住工作的好方法是什么?你能通过活动监视器杀死他们吗?我应该寻求什么过程阻止这项工作通过并终止它?
Aar*_*and 17
我会说永远不要在 GUI 中使用“脱机”的东西,除非你知道数据库没有被使用。通过任何东西。如果不做一些跑腿工作就很难知道这一点,那么为什么不将此脚本保存在某处并始终使用它呢?
USE [master];
GO
ALTER DATABASE $dbname$ SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE $dbname$ SET OFFLINE;
Run Code Online (Sandbox Code Playgroud)
然后当然是倒数:
ALTER DATABASE $dbname$ SET ONLINE;
GO
ALTER DATABASE $dbname$ SET MULTI_USER;
Run Code Online (Sandbox Code Playgroud)
您需要将其设置为SINGLE_USER
first的原因是踢出任何现有用户(在分离对话框中可以选择这样做,而不是在脱机对话框中这样做),因为 SQL Server 需要对数据库的独占访问权限才能采取它离线。现在,您可能想要做一些额外的工作,以查看当前谁在使用数据库,就好像您在大型备份操作或 ETL 作业或您拥有的东西的中间执行此操作一样,这可能会出现问题。
编辑:我已经在 Connect 上提交了关于此的建议(请参阅Connect #2687832),并将其发布到Trello(在“对象资源管理器”下提交)。
这已在 SSMS 16.3 中修复;现在有一个复选框,询问您是否要强制终止任何活动连接。
小智 13
当您已经处于挂起状态时,请不要忘记您可以使用以下命令在服务器上搜索打开的连接
sp_who2
Run Code Online (Sandbox Code Playgroud)
在另一个数据库中,例如 master。
扫描您尝试脱机的任何数据库的结果。
请注意这些行的 spid(进程 ID)列值。
一次一个,跑
kill ##
Run Code Online (Sandbox Code Playgroud)
其中“##”是 spid。
当然要小心以确保这些进程不重要以保持运行......它们甚至会在没有完成最新命令并且没有警告的情况下被终止。