恢复备份时,如何断开所有活动的连接?

我的SQL Server 2005不会因活动连接而恢复备份。 我该如何强制呢?

SQL Server Management Studio 2005

右键单击数据库并单击“ Tasks ,然后单击“ Detach Database ,会popup一个包含活动连接的对话框。

分离屏幕http://www.kodyaz.comhttp://img.dovov.comarticles/kill-all-processes/detach-database.JPG

通过单击“消息”下的超链接,可以终止活动连接。

然后,您可以杀死这些连接而不分离数据库。

更多信息在这里 。

SQL Server Management Studio 2008

SQL Server Management Studio 2008的界面已经改变了,下面是一些步骤(通过: Tim Leung )

  1. 在对象资源pipe理器中右键单击服务器,然后select“活动监视器”。
  2. 当这个打开时,展开进程组。
  3. 现在使用下拉菜单按数据库名称筛选结果。
  4. 通过select右键单击“Kill Process”选项来closures服务器连接。

你想将你的数据库设置为单用户模式,进行恢复,然后将其设置回多用户:

 ALTER DATABASE YourDB SET SINGLE_USER WITH ROLLBACK AFTER 60 --this will give your current connections 60 seconds to complete --Do Actual Restore RESTORE DATABASE YourDB FROM DISK = 'D:\BackUp\YourBaackUpFile.bak' WITH MOVE 'YourMDFLogicalName' TO 'D:\Data\YourMDFFile.mdf', MOVE 'YourLDFLogicalName' TO 'D:\Data\YourLDFFile.ldf' /*If there is no error in statement before database will be in multiuser mode. If error occurs please execute following command it will convert database in multi user.*/ ALTER DATABASE YourDB SET MULTI_USER GO 

参考资料:Pinal Dave( http://blog.SQLAuthority.com

官方参考: https : //msdn.microsoft.com/en-us/library/ms345598.aspx

这段代码为我工作,它杀死了数据库的所有现有连接。 所有你需要做的就是改变Set @dbname ='databaseName'的行,这样它就有你的数据库名称。

 Use Master Go Declare @dbname sysname Set @dbname = 'databaseName' Declare @spid int Select @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) While @spid Is Not Null Begin Execute ('Kill ' + @spid) Select @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) and spid > @spid End 

在此之后,我能够恢复它

重新启动SQL服务器将断开用户连接。 我find的最简单的方法 – 如果你想让服务器离线,也是很好的方法。

但是出于一些非常奇怪的原因,“脱机”选项不能可靠地执行此操作,并且可能会挂起或混淆pipe理控制台。 重新启动然后进行离线工作

有时这是一个选项 – 例如,如果你已经停止了一个作为连接源的web服务器。

尝试这个 …

 DECLARE UserCursor CURSOR LOCAL FAST_FORWARD FOR SELECT spid FROM master.dbo.sysprocesses WHERE DB_NAME(dbid) = 'dbname'--replace the dbname with your database DECLARE @spid SMALLINT DECLARE @SQLCommand VARCHAR(300) OPEN UserCursor FETCH NEXT FROM UserCursor INTO @spid WHILE @@FETCH_STATUS = 0 BEGIN SET @SQLCommand = 'KILL ' + CAST(@spid AS VARCHAR) EXECUTE(@SQLCommand) FETCH NEXT FROM UserCursor INTO @spid END CLOSE UserCursor DEALLOCATE UserCursor GO 

这些都没有为我工作,无法删除或断开当前用户。 也看不到任何活动的连接到数据库。 重新启动SQL Server(右键单击并select重新启动)允许我这样做。

我在SQL Server 2008中自动执行恢复过程时遇到了这个问题。我的(成功的)方法是提供的两个答案的组合。

首先,我运行所有数据库的连接,并杀死它们。

 DECLARE @SPID int = (SELECT TOP 1 SPID FROM sys.sysprocess WHERE dbid = db_id('dbName')) While @spid Is Not Null Begin Execute ('Kill ' + @spid) Select @spid = top 1 spid from master.dbo.sysprocesses where dbid = db_id('dbName') End 

然后,我将数据库设置为single_user模式

 ALTER DATABASE dbName SET SINGLE_USER 

然后,我运行恢复…

 RESTORE DATABASE and whatnot 

再次杀死连接

 (same query as above) 

并将数据库重新设置为multi_user。

 ALTER DATABASE dbName SET MULTI_USER 

这样,我确保在设置为单一模式之前没有任何连接阻止数据库,因为前者将冻结,如果有的话。

要添加已经给出的build议,如果您有通过使用数据库的IIS运行的Web应用程序,则可能还需要在还原时停止 (不回收)该应用程序的应用程序池,然后重新启动。 停止应用程序池会终止活动的http连接,并且不允许其他任何操作,否则最终可能会触发连接到并因此locking数据库的进程。 Umbraco内容pipe理系统恢复数据库时,这是一个已知的问题

以上都没有为我工作。 我的数据库没有显示任何活动连接使用活动监视器或sp_who。 我最终不得不:

  • 右键单击数据库节点
  • select“分离…”
  • 选中“Drop Connections”框
  • 重新连接

不是最优雅的解决scheme,但它的工作原理,它不需要重新启动SQL Server(不是我的select,因为DB服务器托pipe了一堆其他数据库)