SQL-Server: 错误-由于数据库正在使用,无法获得独占访问

实际上,我正在尝试编写一个脚本(在 SqlServer2008中) ,从一个备份文件恢复一个数据库。我做了以下代码,我得到了一个错误-

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.

我该如何解决这个问题?

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
335772 次浏览

我认为您只需要在尝试还原之前将 db 设置为单用户模式,如下所示,只需确保您使用的是 master

USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER

我假设如果要还原一个 db,就不需要关心该 db 上的任何现有事务。对吧?如果是这样,这个方法应该对你有效:

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

现在,还有一件事要注意。将数据库设置为单用户模式后,其他人可能会尝试连接到数据库。如果他们成功了,您将无法继续进行恢复。这是比赛!我的建议是同时运行这三个语句。

在还原数据库之前,使用下面的脚本查找并杀死所有打开的到数据库的连接。

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 [YourDBName]
set offline with rollback immediate

还有这个修复后的:

  alter database [YourDBName]
set online
  1. 设置恢复文件的路径。
  2. 点击左边的“选项”。
  3. 取消选中“恢复前进行尾日志备份”
  4. 勾选复选框-“关闭到目标数据库的现有连接”。 enter image description here
  5. 单击 OK。

对我来说,解决办法是:

  1. 选中左手边 optoins 选项卡中的 Overwrite 现有数据库(WITHREPLACE)。

  2. 取消所有其他选项。

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

  4. 点击确定。

就是这样。

Use Master
alter database databasename set offline with rollback immediate;


--Do Actual Restore
RESTORE DATABASE databasename
FROM DISK = 'path of bak file'
WITH MOVE 'datafile_data' TO 'D:\newDATA\data.mdf',
MOVE 'logfile_Log' TO 'D:\newDATA\DATA_log.ldf',replace


alter database databasename set online with rollback immediate;
GO

下面是我从生产到开发的数据库恢复方法:

注意: 我通过 SSAS 工作来推动生产数据库的日常开发:

步骤1: 删除开发中的前一天备份:

declare @sql varchar(1024);


set @sql = 'DEL C:\ProdAEandAEXdataBACKUP\AE11.bak'
exec master..xp_cmdshell @sql

步骤2: 将生产数据库复制到开发:

declare @cmdstring varchar(1000)
set @cmdstring = 'copy \\Share\SQLDBBackup\AE11.bak C:\ProdAEandAEXdataBACKUP'
exec master..xp_cmdshell @cmdstring

步骤3: 通过运行. sql 脚本还原

SQLCMD -E -S dev-erpdata1 -b -i "C:\ProdAEandAEXdataBACKUP\AE11_Restore.sql"

AE11 _ Restore.sql 文件中的代码:

RESTORE DATABASE AE11
FROM DISK = N'C:\ProdAEandAEXdataBACKUP\AE11.bak'
WITH MOVE 'AE11' TO 'E:\SQL_DATA\AE11.mdf',
MOVE 'AE11_log' TO 'D:\SQL_LOGS\AE11.ldf',
RECOVERY;

当没有足够的磁盘空间来恢复数据库时,我得到了这个错误。清理一些空间解决了这个问题。

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

解决方案1: 重新启动 SQL 服务并尝试还原 DB 解决方案2: 重新启动系统/服务器并尝试还原 DB 解决方案3: 回收当前数据库,删除当前/目标数据库并尝试恢复数据库。

将数据库设置为单用户模式对我来说不起作用,但是将其离线,然后将其恢复到在线状态确实起到了作用。它在数据库的“任务”下的右键菜单中。

一定要选中对话框中的“删除所有活动连接”选项。

让原始数据库离线对我来说很管用

take offline

我在 MSSQLServer2012上尝试还原数据库时遇到了这个问题。

以下是对我有效的方法:

我必须首先在备份文件上运行下面的 RESTORE FILELISTONLY命令来列出逻辑文件名:

RESTORE FILELISTONLY
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'

这显示了数据库的数据和日志文件的 LogicalName和相应的 物理名称:

LogicalName      PhysicalName
com.my_db        C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf
com.my_db_log    C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf

我所要做的就是在我的数据库恢复脚本中分别替换数据库的数据和日志文件的 LogicalName和相应的 物理名称:

USE master;
GO


ALTER DATABASE my_db SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO


    

RESTORE DATABASE my_db
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
WITH REPLACE,
MOVE 'com.my_db' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db.mdf',
MOVE 'com.my_db_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\com.my_db_log.ldf'
GO
    

ALTER DATABASE my_db SET MULTI_USER;
GO

数据库还原任务成功运行:

仅此而已。

希望这个能帮上忙

我得到这个错误时,我不知道,其他人连接到数据库在另一个 SSMS 会话。在我签字退出之后,成功地完成了恢复。

Vinu M Shankar 的 解决方案为我工作。

但是我必须选中: < strong > “恢复前进行尾日志备份” 复选框才能工作。

在我的案例中,尽管我尝试了上面所有的解决方案,但最有效的方法是重新启动 SSMS。