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


Answers:


177

SQL Server管理Studio 2005

当您右键单击一个数据库,Tasks然后单击Detach Database,然后单击时,它将弹出一个对话框,其中包含活动的连接。

分离屏幕

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

然后,您可以取消这些连接而无需分离数据库。

更多信息在这里

SQL Server管理Studio 2008

SQL Server Management Studio 2008的界面已更改,以下是步骤(通过:Tim Leung

  1. 在对象资源管理器中右键单击服务器,然后选择“活动监视器”。
  2. 打开后,展开“进程”组。
  3. 现在,使用下拉列表按数据库名称过滤结果。
  4. 通过选择右键单击“杀死进程”选项来终止服务器连接。

21
如果您遇到与@Ryan相同的问题,则可能是因为您使用的是Management Studio 2008(或更高版本),而不是Management Studio2005。要在Management Studio 2008中执行相同的操作,请在Object中右键单击服务器资源管理器,然后选择“活动监视器”。打开后,展开“进程”组。现在,使用下拉列表按数据库名称过滤结果。现在,您可以通过选择右键单击“杀死进程”选项来终止连接。
Tim Leung 2012年

195

您想要将数据库设置为单用户模式,执行还原,然后将其设置回多用户:

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


11
与其发出立即回滚,不如只在特定的DELAY之后才回滚,从而为用户查询提供了自然完成的机会。
约翰·桑索姆

2
好点,已更新为回滚以包括AFTER 60命令以允许当前查询完成
brendan

@brendan,您好,如果回滚时间超过60秒怎么办?谢谢
user3583912

11
如果要还原数据库,则无论您是ROLLBACK IMMEDIATE还是,都将丢失未完成的事务ROLLBACK AFTER 60。保存该数据的唯一方法是在回滚后执行另一次备份。但是您正在从其他备份中还原。那么,等待的目的是什么?我想念什么吗?
戴夫·梅森

@DMason,我对这个问题也很好奇。在回滚模式下使用single_user是否会在等待时间内阻止新连接?如果是这样,我想知道这是否是一种更干净/更巧妙的方法,至少可以让只读操作完成而不是突然终止它们?
杰森

43

这段代码对我有用,它杀死了数据库的所有现有连接。您所要做的就是更改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

之后,我能够还原它


1
这是最快的方法(SingleUserMode * 20 = 60s,Kill * 20 = 5s)。
卡森2015年

它对我没有用。数据库仍在使用中。我使用SQL Server 2008
马立克酒吧

我发现多次运行该代码,一次又一次,将有效地解决问题。有时,您的杀戮和还原之间会发生一些意外。有时您必须先执行kill操作,然后再执行一次还原。
John Waclawski

完全取决于应用程序尝试重新连接的积极性。几个懒用户?效果很好。可以在一秒钟内重新连接的高容量应用服务器?没那么多。
BradC

5

试试这个:

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

4

重新启动SQL Server将断开用户连接。我发现的最简单方法-如果您想使服务器脱机也很好。

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

有时这是一个选择-例如,如果您已停止作为连接源的Web服务器。


+1。可接受的答案不适用于SQL Express(例如在开发环境中),因为SQL Express没有活动监视器
Matt Frear11年

1
@MattFrear:这是不正确的!至少在2008 R2 Express中,我在服务器节点上看到工具栏按钮和上下文菜单项。
斯蒂芬

4
重新启动整个SQL Server将终止与所有数据库的连接。一台服务器可能支持许多数据库,但现在只需要还原一个即可。
Ross Presser 2015年

3
这绝对是杀死与1个数据库的连接的最坏方法。特别是如果您还有许多其他用户仍在使用的数据库。我强烈建议再次使用此方法。这是100%,总的来说太过强大了!!
John Waclawski

@JohnWaclawski我不知道最糟糕的情况,但肯定是最懒的-这就是为什么我有时说的原因。无论如何,它并没有真正比其他方法节省任何时间
Simon_Weaver

3

我在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

这样,在设置为单模式之前​​,我确保没有连接保持数据库,因为前者将冻结(如果存在)。


2

这些都不适合我,无法删除或断开当前用户的连接。也看不到与数据库的任何活动连接。重新启动SQL Server(右键单击并选择“重新启动”)使我可以执行此操作。


2

为了增加已经给出的建议,如果您有一个通过使用DB的IIS运行的Web应用程序,则还原时可能还需要停止(而不是回收)该应用程序的应用程序池,然后重新启动。停止应用程序池将终止活动的http连接,并且不允许再进行任何其他操作,否则可能最终导致触发连接到数据库并由此锁定数据库的进程。例如,这是Umbraco Content Management System还原数据库时的已知问题


1

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

  • 右键单击数据库节点
  • 选择“分离...”
  • 选中“拖放连接”框
  • 重新连接

这不是最优雅的解决方案,但它可以工作,并且不需要重新启动SQL Server(这对我来说不是一个选择,因为DB服务器托管了许多其他数据库)


这是完全的杀伤力。使用上面的KILL代码。为我完成数百项还原工作。
John Waclawski

我正在使用的数据库不会杀死所有内容-但是,这可能与它们的设置有关。我同意这通常要容易得多。
布伦特·瓦格纳

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.