我的 SQL Server 2005 因为存在活动连接无法还原备份,我该如何强制还原?
我的 SQL Server 2005 因为存在活动连接无法还原备份,我该如何强制还原?
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
,未提交的事务都将丢失。唯一保存这些数据的方法是在回滚后执行另一个备份。但是你正在从不同的备份进行恢复。那么等待有什么意义呢?我是否漏掉了什么重要的信息? - Dave Mason当您右键单击数据库并单击任务
,然后单击分离数据库
时,它会显示一个带有活动连接的对话框。
这段代码对我很有用,它可以关闭数据库的所有现有连接。 你只需要更改 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服务器将会断开用户连接。我发现最简单的方法是把服务器脱机,这也适用于你想要让服务器下线的情况。
但由于某些非常奇怪的原因,“脱机”选项并不能可靠地实现这一点,可能会挂起或混淆管理控制台。先重启再脱机是行得通的。
有时候这是一个选项 - 例如,如果你已经停止了连接源头的Web服务器。
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
然后,我将数据库设置为单用户模式。
ALTER DATABASE dbName SET SINGLE_USER
然后,我运行了还原操作...
RESTORE DATABASE and whatnot
(same query as above)
并将数据库设置为 multi_user 模式。
ALTER DATABASE dbName SET MULTI_USER
在将数据库设置为单用户模式之前,我会确保没有连接正在占用它,因为如果有连接存在,前者会被冻结。
除了之前提供的建议,如果您有一个通过IIS运行并使用数据库的Web应用程序,您可能还需要在恢复时停止(而不是重启)该应用程序的应用程序池,然后重新启动。停止应用程序池会终止活动的HTTP连接并阻止更多的连接,否则可能会触发连接到并锁定数据库的进程,这是例如Umbraco内容管理系统在恢复其数据库时已知的问题。
对我来说,这些都没有起作用,无法删除或断开当前用户。也无法看到与数据库的任何活动连接。重新启动SQL Server(右键单击并选择“重新启动”)使我能够做到。
以上方法都对我没用。使用活动监视器或sp_who时,我的数据库没有显示任何活动连接。最终我不得不:
这不是最优雅的解决方案,但它有效,并且不需要重启SQL Server(对我来说不是一个选项,因为DB服务器托管了许多其他数据库)。
我更喜欢这样做:
将数据库设置为脱机状态,并立即回滚
然后恢复你的数据库。 之后,
将数据库设置为联机状态,并立即回滚