错误 - 无法获取独占访问权限,因为数据库正在使用中

Ste*_*eam 93 sql sql-server sql-server-2008

我实际上是在尝试创建一个脚本(在Sql Server 2008中)从一个备份文件中恢复一个数据库.我做了以下代码,我收到一个错误 -

Msg 3101, Level 16, State 1, Line 3
Exclusive access could not be obtained because 
the database is in use.
Msg 3013, Level 16, State 1, Line 3
RESTORE DATABASE is terminating abnormally.
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

IF DB_ID('AdventureWorksDW') IS NOT NULL 
BEGIN 
RESTORE DATABASE [AdventureWorksDW] 
FILE = N'AdventureWorksDW_Data' 
FROM  
DISK = N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\Backup\AdventureWorksDW.bak' 
WITH  FILE = 1, 
MOVE N'AdventureWorksDW_Data' 
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW.mdf', 
MOVE N'AdventureWorksDW_Log'  
TO N'C:\Program Files\Microsoft SQL Server\
MSSQL10_50.SS2008\MSSQL\DATA\AdventureWorksDW_0.LDF', 
NOUNLOAD,  STATS = 10 
END
Run Code Online (Sandbox Code Playgroud)

小智 183

  1. 设置还原文件的路径.
  2. 单击左侧的"选项".
  3. 勾选复选框 - "关闭与目标数据库的现有连接". 在此输入图像描述
  4. 单击确定.

希望这会奏效.

  • 在我的情况下,复选框显示为灰色.但是我重新开始并且在选择要恢复的源之前能够选中该框.选择备份文件后,该选项再次显示为灰色,但仍然检查了该框并且恢复正常. (15认同)
  • 在恢复之前,我还必须取消选中"在恢复前进行尾部日志备份". (10认同)
  • 感谢我免于输入SQL.所有答案中唯一的GUI方法. (3认同)
  • "在恢复之前进行尾部日志备份"这也需要取消选中.谢谢 (3认同)
  • 在选择要恢复的文件之前,我进入选项并选择关闭所有现有连接。之后我选择了要恢复的文件。这种方式对我有用。 (2认同)

Dav*_*son 87

我假设如果您正在恢复数据库,则不关心该数据库上的任何现有事务.对?如果是这样,这应该对你有用:

USE master
GO

ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
--This rolls back all uncommitted transactions in the db.
WITH ROLLBACK IMMEDIATE
GO

RESTORE DATABASE AdventureWorksDW
FROM ...
...
GO
Run Code Online (Sandbox Code Playgroud)

现在,还要注意一个额外的项目.将数据库设置为单用户模式后,其他人可能会尝试连接到数据库.如果成功,您将无法继续还原.这是一场比赛!我的建议是一次运行所有三个语句.

  • 只需在末尾添加`ALTER DATABASE [AdventureWorksDW] SET MULTI_USER`,以确保数据库恢复正常的多用户模式. (6认同)
  • 他实际上是指`USE master`,而不是'USER master`. (2认同)

And*_*ski 39

在恢复数据库之前执行此查询:

alter database [YourDBName] 
set offline with rollback immediate
Run Code Online (Sandbox Code Playgroud)

恢复后这一个:

  alter database [YourDBName] 
  set online
Run Code Online (Sandbox Code Playgroud)

  • 在试点应用程序连接击败查询的恢复和后续的 MULTI_USER 调用后,我最终通过 SINGLE_USER 切换到此方法。恢复无法获得独占访问权限,旧数据库仍处于 SINGLE_USER 模式。 (3认同)
  • 这对我有用.恢复后它会自动联机. (2认同)
  • 这是有效的,它避免了接受的答案中的竞争条件. (2认同)
  • 这应该是公认的答案 (2认同)

Ali*_*aca 18

将原始数据库离线对我有用

离线

  • 这对我的 mgmt studio 2018/2019 也有用 (2认同)

小智 10

对我来说,解决方案是:

  1. 选中在左侧的optoins选项卡中覆盖现有数据库(WITH REPLACE).

  2. 取消选中所有其他选项.

  3. 选择源和目标数据库.

  4. 点击确定.

而已.


Aqe*_*der 7

在还原数据库之前,请使用以下脚本查找并终止所有已打开的数据库连接.

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...'
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助......


Bab*_*New 5

我刚刚重新启动 sqlexpress 服务,然后恢复正常完成