167

由于活动连接,我的 SQL Server 2005 不会恢复备份。我怎么能强迫它?

4

10 回答 10

197

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

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

于 2009-07-20T15:25:20.237 回答
181

SQL Server 管理工作室 2005

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

分离屏幕

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

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

更多信息在这里

SQL Server 管理工作室 2008

SQL Server Management Studio 2008 的界面已更改,步骤如下(来自:Tim Leung

  1. 在对象资源管理器中右键单击服务器并选择“活动监视器”。
  2. 当它打开时,展开 Processes 组。
  3. 现在使用下拉菜单按数据库名称过滤结果。
  4. 通过选择右键单击“终止进程”选项来终止服务器连接。
于 2009-07-20T15:20:50.150 回答
44

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

在此之后我能够恢复它

于 2012-05-31T10:04:58.247 回答
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
于 2013-04-12T22:46:31.827 回答
4

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

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

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

于 2010-04-11T08:02:51.027 回答
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

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

于 2016-10-05T18:40:57.507 回答
2

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

于 2012-05-01T03:04:56.047 回答
2

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

于 2013-07-31T00:30:05.490 回答
1

以上都不适合我。我的数据库没有使用 Activity Monitor 或 sp_who 显示任何活动连接。我最终不得不:

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

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

于 2016-01-27T03:48:40.230 回答
1

我更喜欢这样做,

更改数据库设置为脱机并立即回滚

然后恢复你的数据库。之后,

alter database set online with rollback immediate

于 2019-04-04T09:33:20.447 回答