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


278

我正在尝试对我的开发数据库执行一些脱机维护(从实时备份还原开发数据库),但是通过SQL Server Management Studio进行的“脱机”命令执行速度非常慢-大约需要30分钟。我只是想尽办法,似乎无法在线找到有关可能导致速度问题或如何解决速度问题的任何参考。

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

是什么导致这种速度下降,我该如何加快速度呢?

Answers:


408

经过一些额外的搜索(受gbn的答案和u07ch对KMike的答案的启发而启发的新搜索词),我发现了这一点,并在2秒内成功完成:

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(更新)

如果仍然失败并出现以下错误,则可以按照此博客文章的建议进行修复:

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

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

EXEC sp_who2

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

KILL <SPID>

然后ALTER DATABASE再次运行该命令。现在应该可以了。


35
如果这不起作用(无法放置锁),请在stackoverflow.com/questions/4673065中尝试解决方案。
2012年

3
如果“使数据库脱机”进程仍在运行,则对于开发机,您可以从任务管理器中将其杀死并运行以上命令。
空头

1
如果您运行KILL命令并收到消息“无法使用KILL杀死自己的进程。”,请确保您正在使用master数据库运行该命令
Jarrod

129

最有可能从某个地方连接到数据库(一个罕见的示例:异步统计信息更新

若要查找连接,请使用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

7
+1是因为流程查询使您知道该数据库连接了什么。在我的情况下,这是一个开放的SSMS流氓员工:)
MikeMurko

3
就我而言,我是打开查询分析器窗口的流氓
dellyjm 2015年

1
在我的情况下,开发人员有一个非常知名的银行的生产主网站,它指向一个数据库,名称为OLD
ZZ9 '16

3
如果说ALTER DATABASE failed because a lock could not be placed on database命令KILL <SPID>会有所帮助
Muflix

28

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

将其置于单用户模式,然后重试。


2
ALTER DATABASE <DBNAME>设置
SINGLE_USER,具有

KMike-我唯一的连接是打开到Master数据库,而不是我要脱机的数据库。
Erik Forbes

17

就我而言,在等待了这么长时间之后,我没有耐心,只是关闭了管理工作室。退出之前,它显示成功消息,db处于脱机状态。这些文件可以重命名。


7

执行存储过程sp_who2

这将使您看到是否有任何阻塞锁。杀死它们应该修复它。


5

在SSMS中:右键单击“ SQL Server”图标“活动监视器”。开放流程。查找已处理的连接。右键单击该进程,杀死。


4

每当您遇到这种情况时,都应该始终想到事务日志。具有立即回滚的alter db语句表明是这种情况。检查一下:http : //msdn.microsoft.com/en-us/library/ms189085.aspx

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


2
明智的建议-谢谢-但是在这种情况下,数据是消耗性的,因为它是要还原到的开发数据库。
Erik Forbes

3

关闭发出请求的SSMS(SQL服务管理器)实例为我解决了问题。


3

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


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

2

为了解决这个问题,我停止了连接到IIS中数据库的网站,然后立即冻结了“冻结”“使数据库脱机”面板。


2

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

  1. EXEC sp_who
  2. 杀死<SPID>

  3. 带有立即回滚的ALTER DATABASE SET SINGLE_USER

    具有立即回滚的ALTER DATABASE SET OFFLINE

    结果:以上两个命令也都卡住了。

4。右键单击数据库->属性->选项,将数据库只读设置为True,在对话框中警告SQL Server将关闭与数据库的所有连接,然后单击“是”。

结果:窗口卡在执行中。

作为最后的选择,我从配置管理器中重新启动了SQL Server服务,然后运行ALTER DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE。它像魅力一样运作



1

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

在我的情况下,有一个网站具有与数据库的开放连接。这种方法很简单:

  1. 右键单击数据库->属性->选项
  2. 设为Database Read-OnlyTrue
  3. 在警告SQL Server的对话框中单击“是”,将关闭与数据库的所有连接。
  4. 重新打开选项,然后关闭只读
  5. 现在尝试重命名数据库或使其脱机。

0

对我来说,我只需要进入“作业活动监控器”并停止正在处理的两件事。然后它立即脱机。就我而言,尽管我知道这两个过程是什么,也可以停止它们。


0

就我而言,该数据库与旧的Sharepoint安装有关。在服务器管理器中停止和禁用相关服务“取消挂起”已运行40分钟的脱机操作,该操作立即完成。

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


1
运行sp_who2以查看哪些进程正在使用数据库并用于kill <PID>停止它们。
埃里克·基加西

0

下次,请记住从“脱机”对话框中选中“删除所有活动连接”复选框。我也在没有连接的本地计算机上使用SQL_EXPRESS,但是除非我选中该复选框,否则这种减速对我而言会发生。


-1

就我而言,我停止了Tomcat服务器。然后数据库立即脱机。

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.