提问



我试图在我的开发数据库上执行一些离线维护(从实时备份中恢复数据库),但是通过SQL Server Management Studio执行脱机命令正在缓慢执行 - 按顺序现在是30分钟。我只是在我的智慧结束时,我似乎无法在网上找到任何可能导致速度问题或如何解决问题的参考资料。


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


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

最佳参考


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


ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE


(更新)



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



  ALTER DATABASE失败,因为无法将锁定放在数据库dbname上稍后再试。



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


EXEC sp_who2


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


KILL <SPID>


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

其它参考1


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


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


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


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


USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

其它参考2


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


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

其它参考3


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

其它参考4


执行存储过程
sp_who2


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

其它参考5


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

其它参考6


任何时候遇到这种类型的东西,你应该总是想到你的事务日志。带有立即回滚的alter db statment表明情况就是如此。看看这个:http://msdn.microsoft.com/en-us/library/ms189085.aspx [13]


检查点等等。您需要确定日志中的事务是否值得保存,然后选择模式以相应地运行数据库。你真的没有理由等待,也没有理由让你丢失数据 - 你可以同时拥有两者。

其它参考7


为了解决这个问题,我停止了在IIS中连接到数据库的网站,并立即解冻了冻结取消数据库脱机面板。

其它参考8


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

其它参考9


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

其它参考10


此外,关闭您可能已打开的任何查询窗口,这些窗口已连接到相关数据库;)

其它参考11


在SSMS中,将数据库设置为只读然后返回。连接将被关闭,从而释放锁。


就我而言,有一个网站与数据库有开放的连接。这种方法很简单:



  1. 右键单击数据库 - >属性 - >选项

  2. Database Read-Only设置为True

  3. 在对话框中单击是警告SQL Server将关闭与数据库的所有连接。

  4. 重新打开选项并关闭只读

  5. 现在尝试重命名数据库或使其脱机。


其它参考12


对我来说,我只需要进入Job Activity Monitor并停止处理两件事。然后它立即下线。在我的情况下,虽然我知道这两个过程是什么,并且可以阻止它们。

其它参考13


在我的情况下,我停止了Tomcat服务器。然后数据库立即脱机。

其它参考14


在我的例子中,数据库与旧的Sharepoint安装有关。停止并禁用服务器管理器中的相关服务取消已离线操作,该操作已运行40分钟,并立即完成。


您可能希望检查当前是否有任何服务正在使用该数据库。

其它参考15


下次,从脱机对话框中,请记住选中删除所有Activity连接复选框。我也在没有连接的本地机器上使用SQL_EXPRESS,但除非我选中了该复选框,否则这种情况发生在我身上。

其它参考16


我尝试了下面的所有建议,没有任何效果。



  1. EXEC sp_who

  2. 杀死< SPID>

  3. ALTER DATABASE SET SINGLE_USER WITH Rollback Immediate


    ALTER DATABASE设置为OFFLINE,ROLLBACK IMMEDIATE


    结果:上述命令都被卡住了。



4。右键单击数据库 - >属性 - >选项
   将Database Read-Only设置为True
   在对话框警告单击是,SQL Server将关闭与数据库的所有连接。


结果:窗口停止执行。


作为最后的手段,我从配置管理器重新启动SQL服务器服务,然后使用ROLLBACK IMMEDIATE运行ALTER DATABASE SET OFFLINE。它就像一个魅力