由于活动连接,我的SQL Server 2005无法还原备份。我该如何强迫?
由于活动连接,我的SQL Server 2005无法还原备份。我该如何强迫?
Answers:
当您右键单击一个数据库,Tasks
然后单击Detach Database
,然后单击时,它将弹出一个对话框,其中包含活动的连接。
通过单击“消息”下的超链接,您可以终止活动的连接。
然后,您可以取消这些连接而无需分离数据库。
更多信息在这里。
SQL Server Management Studio 2008的界面已更改,以下是步骤(通过:Tim Leung)
您想要将数据库设置为单用户模式,执行还原,然后将其设置回多用户:
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
ROLLBACK IMMEDIATE
还是,都将丢失未完成的事务ROLLBACK AFTER 60
。保存该数据的唯一方法是在回滚后执行另一次备份。但是您正在从其他备份中还原。那么,等待的目的是什么?我想念什么吗?
这段代码对我有用,它杀死了数据库的所有现有连接。您所要做的就是更改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
之后,我能够还原它
试试这个:
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将断开用户连接。我发现的最简单方法-如果您想使服务器脱机也很好。
但是出于某些非常奇怪的原因,“脱机”选项不能可靠地执行此操作,并且可能挂起或混淆管理控制台。重新启动然后进行离线工作
有时这是一个选择-例如,如果您已停止作为连接源的Web服务器。
我在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
这样,在设置为单模式之前,我确保没有连接保持数据库,因为前者将冻结(如果存在)。
以上都不对我有用。我的数据库使用活动监视器或sp_who没有显示任何活动的连接。我最终不得不:
这不是最优雅的解决方案,但它可以工作,并且不需要重新启动SQL Server(这对我来说不是一个选择,因为DB服务器托管了许多其他数据库)
我更喜欢这样
脱机更改数据库集并立即回滚
然后还原您的数据库。之后,
在线更改数据库集并立即回滚