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

我试图在我的开发数据库上执行一些离线维护(从实时备份恢复开发数据库),但通过SQL Server Management Studio的“脱机”命令正在缓慢地执行 -大约30分钟以上。我只是在我的智慧的尽头,我似乎找不到任何参考网上可能导致速度问题,或如何解决它。

一些站点建议,打开到数据库的连接会导致这种放缓,但使用此数据库的唯一应用程序是我的开发机器的IIS实例,并且服务已停止—没有更多打开的连接。

是什么导致了这种减速,我能做些什么来加速它?

342459 次浏览

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

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

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

要查找连接,使用sys.sysprocesses

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

要强制断开连接,使用立即回滚

USE master
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

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

ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE

(更新)

当此操作仍然失败并出现以下错误时,您可以根据这篇博文的启发进行修复:

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

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

EXEC sp_who2

并使用你在以下命令中找到的SPID:

KILL <SPID>

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

任何时候遇到这种情况,您都应该考虑您的事务日志。带有rollback immediate的alter db语句表明是这种情况。看看这个:http://msdn.microsoft.com/en-us/library/ms189085.aspx

钻研检查点等等。您需要决定日志中的事务是否值得保存,然后选择相应的模式来运行数据库。真的没有理由让你不得不等待,但也没有理由让你失去数据——你可以两者兼得。

以我为例,在等待了这么久之后,我没有耐心,干脆关闭了管理工作室。退出前,显示成功消息,db is offline。可以重命名这些文件。

为了解决这个问题,我停止了在IIS中连接到db的网站,立即“冻结”“使db离线”面板解冻。

在SSMS中:右键单击SQL server图标,Activity Monitor。开放的过程。找到被处理的连接。右键单击进程,Kill。

关闭SSMS (SQL服务管理器)的实例,从请求解决了我的问题.....

对我来说,我只需要进入Job Activity Monitor并停止正在处理的两件事情。然后它马上就下线了。就我而言,我知道这两个过程是什么,也知道停止它们是可以的。

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

在我的情况下,我停止Tomcat服务器。然后DB立刻离线了。

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

在我的例子中,有一个网站打开了到数据库的连接。这个方法很简单:

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

在我的例子中,数据库与旧的Sharepoint安装有关。在服务器管理器中停止和禁用相关服务“解除”已经运行了40分钟的脱机操作,并立即完成。

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

执行存储过程 sp_who2 < / p >

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

在我的情况下,在执行这个操作之前,我已经在DB中查看了一些表。我的用户帐户持有到SSMS中此DB的活动连接。一旦我从SSMS中的服务器断开连接(使“使数据库脱机”对话框打开),操作成功。

下次,在“脱机”对话框中,记得选中“删除所有活动连接”复选框。我也在本地机器上的SQL_EXPRESS上,没有连接,但除非我选中该复选框,否则会出现这种减速。

我尝试了下面所有的建议,但都没用。

  1. EXEC sp_who
  2. 杀死& lt;SPID >

  3. ALTER DATABASE SET SINGLE_USER WITH Rollback Immediate

    使用立即回滚脱机更改数据库设置

    .输出说明
< p > 4。右键单击数据库-> Properties -> Options “数据库只读”设置为“True” 在弹出的对话框中单击“是”,警告SQL Server将关闭到数据库的所有连接

结果:窗口在执行时卡住。

作为最后的手段,我从配置管理器中重新启动SQL server服务,然后运行ALTER DATABASE SET OFFLINE WITH ROLLBACK IMMEDIATE。这招很管用