转自:http://blog.51cto.com/jimshu/1619024
在还原数据库时,可能遇到“Exclusive access could not be obtained because the database is in use”错误。
很多时候这是一个经常遇到的错误,这是因为我们在尝试恢复数据库时,这个数据库却正在被另一个用户使用。
有很多种可能的原因导致这个错误。最常见的一种原因,是用户在SSMS打开了一个查询,但是忘记关闭查询窗口。
常规的方法有以下:
1. 查找所有的活动连接,然后kill掉它们,再还原数据库。
2. 将数据库脱机(这将关闭当前的所有连接) ,然后联机,再还原数据库。
方法一:kill 所有的进程
运行以下脚本,清除当前的所有进程
declare @sql as varchar(20), @spid as int
select @spid = min(spid) from master..sysprocesses where dbid = db_id('<database_name>')
and spid != @@spid
while (@spid is not null)
begin
print 'Killing process ' + cast(@spid as varchar) + ' ...'
set @sql = 'kill ' + cast(@spid as varchar)
exec (@sql)
select
@spid = min(spid)
from
master..sysprocesses
where
dbid = db_id('<database_name>')
and spid != @@spid
end
print 'Process completed...'
方法二:将数据库脱机
运行以下脚本,将数据库脱机然后再连机,从而断开当前的所有连接。
alter database database_name<br>set offline with rollback immediate
alter database database_name
set online
go
方法三:切换到单用户模式
运行以下脚本,将数据库置于单用户模式然后再切换回到多用户模式,从而断开当前的所有连接。这种方法比上一种方法要快。
use master
go
alter database <dbname>
set single_user with rollback immediate
go
alter database <dbname>
set multi_user
go
原文 http://www.codeproject.com/Articles/315538/Exclusive-access-could-not-be-obtained-because-the
译者注:
要警惕某些应用程序(或后台服务),它们可能定期尝试连接到这个数据库。遇到这种情况,请务必事先找到并停用这些应用程序(或后台服务),不然上述方法没有效果。
终极方案:删除这个数据库吧!