我实际上是在尝试创建一个脚本(在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.
如何解决此问题?
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
答案 0 :(得分:153)
答案 1 :(得分:75)
我假设如果您正在恢复数据库,则不关心该数据库上的任何现有事务。对?如果是这样,这应该对你有用:
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
现在,还要注意一个额外的项目。将数据库设置为单用户模式后,其他人可能会尝试连接到数据库。如果成功,您将无法继续还原。这是一场比赛!我的建议是一次运行所有三个语句。
答案 2 :(得分:32)
在恢复数据库之前执行此查询:
alter database [YourDBName]
set offline with rollback immediate
恢复之后和这个:
alter database [YourDBName]
set online
答案 3 :(得分:6)
在恢复数据库之前,请使用以下脚本查找并终止所有已打开的数据库连接。
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...'
希望这会有所帮助......
答案 4 :(得分:6)
对我来说,解决方案是:
选中在左侧的optoins选项卡中覆盖现有数据库(WITH REPLACE)。
取消选中所有其他选项。
选择源和目标数据库。
点击确定。
就是这样。
答案 5 :(得分:3)
答案 6 :(得分:2)
我认为您只需要在尝试恢复之前将数据库设置为单用户模式,如下所示,只需确保您使用master
USE master
GO
ALTER DATABASE AdventureWorksDW
SET SINGLE_USER
答案 7 :(得分:0)
这是我从生产到开发的数据库恢复方式:
注意:我是通过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;
答案 8 :(得分:0)
当没有足够的磁盘空间来恢复Db时,我收到此错误。清理一些空间解决了它。
答案 9 :(得分:0)
解决方案1:重新启动SQL服务并尝试还原数据库 解决方案2:重新启动系统/服务器并尝试还原数据库 解决方案3:取回当前数据库,删除当前/目标数据库,然后尝试还原数据库。
答案 10 :(得分:0)
将数据库设置为单用户模式对我来说不起作用,但是将其脱机然后又使其重新联机确实可行。在数据库的右键菜单中,在“任务”下。
请确保选中对话框中的“删除所有活动连接”选项。
答案 11 :(得分:0)
当我尝试在MS SQL Server 2012上还原数据库时遇到了这个问题。
这是对我有用的:
我必须首先在备份文件上运行以下RESTORE FILELISTONLY
命令以列出逻辑文件名:
RESTORE FILELISTONLY
FROM DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\my_db_backup.bak'
这分别显示了数据库的数据和日志文件的 LogicalName 和相应的 PhysicalName :
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 和相应的 PhysicalName :>
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
数据库还原任务成功运行:
仅此而已。
我希望这会有所帮助
答案 12 :(得分:0)
我不知道这个错误,因为有人在另一个SSMS会话中将其他人连接到数据库。我将它们注销后,还原成功完成。
答案 13 :(得分:-1)
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
答案 14 :(得分:-1)
我刚刚重新启动了sqlexpress服务,然后恢复正常完成