在还原数据库时,可能遇到“Exclusive access could not be obtained because the database is in use”错误。

 

wKiom1T-m2-RSl09AADCXuj1CVo357.jpg

 

  很多时候这是一个经常遇到的错误,这是因为我们在尝试恢复数据库时,这个数据库却正在被另一个用户使用。

  有很多种可能的原因导致这个错误。最常见的一种原因,是用户在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

 

译者注:

  要警惕某些应用程序(或后台服务),它们可能定期尝试连接到这个数据库。遇到这种情况,请务必事先找到并停用这些应用程序(或后台服务),不然上述方法没有效果。

  终极方案:删除这个数据库吧!