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

SQLServer2005由于连接处于活动状态而无法还原备份。如何强制执行该备份?

244657 次浏览

SQLServerManagementStudio2005

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

Detach Screen

通过点击“消息”下的超链接,您可以关闭活动连接。

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

更多信息 给你

SQLServerManagementStudio2008

SQLServerManagementStudio 2008的接口已经更改,下面是步骤(通过 小良)

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

您希望将 db 设置为单用户模式,执行还原操作,然后将其设置回多用户模式:

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

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

但是由于一些非常奇怪的原因,‘ Take Offline’选项不能可靠地完成这一任务,并且可能会挂起或混淆管理控制台。重新启动然后离线工作

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

这些都不适合我,不能删除或断开当前用户。也看不到任何活动的数据库连接。重新启动 SQLServer (右键单击并选择 Restart)允许我这样做。

这个代码对我有用,它杀死了一个数据库的所有现有连接。 您只需要更改 Set@dbname = ‘ database aseName’行,使其具有您的数据库名称。

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

在这之后,我能够恢复它

试试这个:

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

为了补充已经给出的建议,如果您有一个通过 IIS 运行的 Web 应用程序使用数据库,您可能还需要 别说了(而不是回收)的应用程序池恢复,然后重新启动。停止应用程序池会杀死活动的 http 连接,并且不允许更多的连接,否则最终可能会触发连接到数据库的进程,从而锁定数据库。这是一个已知的问题,例如 Umbraco 内容管理系统在还原其数据库时出现的问题

以上这些对我来说都不管用。我的数据库没有显示任何使用 Activity Monitor 或 sp _ who 的活动连接。我最终不得不:

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

虽然不是最优雅的解决方案,但是它可以工作,而且不需要重新启动 SQLServer (对我来说不是一个选项,因为 DB 服务器承载了许多其他数据库)

我在 SQLServer2008中自动执行还原过程时遇到了这个问题。 我的(成功的)方法是两个答案的混合。

首先,我遍历所有数据库的连接,然后杀死它们。

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

通过这种方式,我确保在设置为单模式之前没有连接阻塞数据库,因为如果有连接,前者将会冻结。

我更喜欢这样,

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

然后恢复数据库。 之后,

立即回滚在线更改数据库设置