还原备份时,如何断开所有活动连接?

Jad*_*ias 166 sql-server backup sql-server-2005 restore disconnect

由于活动连接,我的SQL Server 2005无法还原备份.我怎么强迫它?

bre*_*dan 191

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

  • 不是发出IMMEDIATE ROLLBACK,而是在特定的DELAY之后仅与ROLLBACK相关,从而为用户查询提供了自然完成的机会. (11认同)
  • 如果要还原数据库,无论是"ROLLBACK IMMEDIATE"还是"ROLLBACK AFTER 60",打开的事务都将丢失.保存该数据的唯一方法是在回滚后执行另一个备份.但是你要从不同的备份中恢复.那么等待的重点是什么?我错过了什么吗? (11认同)
  • 好点,更新为回滚以包含AFTER 60命令以允许当前查询完成 (2认同)

Geo*_*ker 174

SQL Server Management Studio 2005

右键单击数据库并单击Tasks然后单击时Detach Database,将显示一个包含活动连接的对话框.

分离屏幕http://www.kodyaz.com/images/articles/kill-all-processes/detach-database.JPG

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

然后,您可以在不分离数据库的情况下终止这些连接.

更多信息在这里.

SQL Server Management Studio 2008

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

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

  • 如果您遇到与@Ryan相同的问题,可能是因为您使用的是Management Studio 2008(或更高版本),而不是Management Studio 2005.要在Management Studio 2008中执行相同操作,请在Object中右键单击您的服务器资源管理器并选择"活动监视器".打开时,展开"进程"组.现在使用下拉列表按数据库名称过滤结果.您现在可以通过选择右键单击"Kill Process"选项来终止连接. (20认同)

Rag*_*ock 42

这段代码对我有用,它会杀死数据库的所有现有连接.您所要做的就是更改行@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
Run Code Online (Sandbox Code Playgroud)

在此之后,我能够恢复它


Sim*_*ver 5

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

但是出于一些非常奇怪的原因,"Take Offline"选项不能可靠地执行此操作,并且可能会挂起或混淆管理控制台.重新启动然后离线工作

有时这是一个选项 - 例如,如果你已经停止了作为连接源的网络服务器.

  • 重新启动整个SQL Server将终止与所有数据库的连接.服务器可能支持许多数据库,但现在只需要恢复一个. (4认同)
  • 这绝对是杀死1个数据库连接的最糟糕方式.特别是如果您还有许多其他用户仍在使用其他数据库.我强烈建议使用这种方法AGAINST.这是100%,总矫枉过正!! (3认同)

小智 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
Run Code Online (Sandbox Code Playgroud)