将SQL Server数据库脱机的极度等待时间
我试图在我的开发数据库上执行一些脱机维护(从活动备份开始数据库恢复),但是通过SQL Server Management Studio执行的“脱机”命令的执行速度非常慢,大约在30分钟以上。 我只是在我的智慧结束,我似乎无法find任何网上提到什么可能会导致速度问题,或如何解决它。
一些网站build议开放连接到数据库导致这种放缓,但使用这个数据库的唯一应用程序是我的开发机器的IIS实例,服务停止 – 没有更多的开放连接。
有什么可能导致这种放缓,我能做些什么来加速呢?
经过一些额外的search(由gbn的答案启发的新search条款和u07ch评论KMike的答案),我发现这个,在2秒内成功完成:
ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE
(更新)
当这仍然失败并出现以下错误时,您可以按照本博客文章的启发修复它:
ALTER DATABASE因数据库'dbname'无法locking而失败请稍后重试。
您可以运行以下命令来找出谁在locking您的数据库:
EXEC sp_who2
并使用您在以下命令中find的任何SPID
:
KILL <SPID>
然后再次运行ALTER DATABASE
命令。 它现在应该工作。
很有可能从某处连接到数据库(一个罕见的例子: asynchronous统计更新 )
要查找连接,请使用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
你有没有连接到这个数据库的任何开放的SQL Server Management Studio窗口?
把它放在单用户模式,然后再试一次。
就我而言,在等待完成之后,我没有耐心,只是closures了pipe理工作室。 在退出之前,它显示成功消息,db处于脱机状态。 这些文件可以重命名。
在SSMS中:右键单击SQL服务器图标,活动监视器。 打开进程。 find已处理的连接。 用鼠标右键单击该进程,Kill。
任何时候遇到这种types的事情,你总是应该考虑你的事务日志。 带有回滚立即数的alter db statment指出了这种情况。 看看这个: http : //msdn.microsoft.com/en-us/library/ms189085.aspx
在检查站等等。你需要决定你的日志中的事务是否值得保存,然后select相应的模式来运行你的数据库。 你真的没有理由不得不等待,也没有理由丢失数据 – 你可以有两个。
执行存储过程sp_who2
这将允许你看看是否有任何阻塞锁。杀死他们应该修复它。
为了解决这个问题,我停止了连接到IIS中的数据库的网站,并立即冻结了“数据库离线”面板解冻。
closures从中请求的SSMS(SQL服务pipe理器)的实例解决了我的问题…..
另外,closures所有连接到相关数据库的查询窗口;)
在SSMS中,将数据库设置为只读然后返回。 连接将被closures,释放锁。
在我的情况下,有一个网站有开放的连接到数据库。 这个方法很简单:
- 右键单击数据库 – >属性 – >选项
- 将
Database Read-Only
设置为True - 在对话框中单击“是”警告SQL Server将closures到数据库的所有连接。
- 重新打开“选项”并将其恢复为只读状态
- 现在尝试重命名数据库或使其脱机。
对我来说,我只需要进入工作活动监视器,并停止正在处理的两件事情。 然后立即下线。 在我的情况下,虽然我知道这两个过程是什么,可以阻止他们。
在我的情况下,我停止了Tomcat服务器。 然后数据库立即脱机。
就我而言,数据库与旧的Sharepoint安装有关。 停止和禁用服务器pipe理器中的相关服务“解除”已经运行了40分钟的离线操作,并立即完成。
您可能希望检查是否有任何服务正在使用数据库。
就我而言,在执行此操作之前,我已经查看了数据库中的一些表格。 我的用户帐号在SSMS中持有到这个数据库的活动连接。 一旦我从SSMS中的服务器断开连接(将“使数据库脱机”对话框打开),操作成功。