使SQL Server数据库脱机时的极限等待时间

Eri*_*bes 275 database performance sql-server-2005

我正在尝试在我的开发数据库上执行一些离线维护(从实时备份中删除数据库),但是通过SQL Server Management Studio执行的"Take Offline"命令执行速度非常慢 - 大约30分钟加上现在.我只是在我的智慧结束,我似乎无法在网上找到任何可能导致速度问题,或如何解决它的参考.

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

什么可能导致这种放缓,我该怎么做才能加快速度?

Eri*_*bes 402

经过一些额外的搜索(新的搜索术语受到gbn的回答和u07ch对KMike回答的评论的启发)我发现了这个,它在2秒内成功完成:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

(更新)

当这仍然失败并出现以下错误时,您可以按照此博客文章的灵感来修复它:

ALTER DATABASE失败,因为无法将锁定放在数据库'dbname'以后再试.

您可以运行以下命令来找出谁在您的数据库上保持锁定:

EXEC sp_who2
Run Code Online (Sandbox Code Playgroud)

并使用SPID您在以下命令中找到的任何内容:

KILL <SPID>
Run Code Online (Sandbox Code Playgroud)

然后ALTER DATABASE再次运行该命令.它现在应该工作.

  • 如果这不起作用(无法放置锁),请尝试http://stackoverflow.com/questions/4673065中的解决方案. (35认同)
  • 如果Take DB Offline进程仍在运行,对于dev机器,您可以从任务管理器中删除它并运行上面的命令. (3认同)

gbn*_*gbn 127

很可能是从某个地方连接到数据库(一个罕见的例子:异步统计更新)

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

USE master
SELECT * FROM sys.sysprocesses WHERE dbid = DB_ID('MyDB')
Run Code Online (Sandbox Code Playgroud)

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

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

  • +1,因为进程查询可以让您知道连接到此数据库的内容.在我的情况下,这是一个SSMS开放的流氓员工:) (7认同)
  • 在我的情况下,我是一个打开查询分析器窗口的流氓 (3认同)
  • 如果它说"ALTER DATABASE失败,因为无法将锁定放在数据库上"命令`KILL <SPID>`将有助于 (3认同)

KM.*_*KM. 28

您是否有连接到此数据库的任何打开的SQL Server Management Studio窗口?

将其置于单用户模式,然后再试一次.

  • 简单地关闭SQL Management Studio对我有用! (25认同)
  • 关闭查询的@ geo1701也将起作用:P (3认同)
  • ALTER DATABASE <DBNAME> SET SINGLE_USER WITH Rollback Immediate (2认同)

Rud*_*udy 17

在我的情况下,等待它完成后我没有耐心,只是关闭管理工作室.在退出之前,它显示了成功消息,db已脱机.这些文件可以重命名.


小智 6

执行存储过程sp_who2

这将允许您查看是否有任何阻塞锁..杀死他们应该修复它.


nze*_*min 5

在SSMS中:右键单击SQL Server图标,Activity Monitor.开放流程.找到已处理的已连接.右键单击该进程,Kill.


小智 5

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