错误 – 由于数据库正在使用而无法获得独占访问
我实际上是试图使一个脚本(在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
我假设,如果你正在恢复数据库,你不关心该数据库上的任何现有的交易。 对? 如果是这样,这应该为你工作:
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
现在,另外一个项目要注意。 将数据库设置为单用户模式后,其他人可能会尝试连接到数据库。 如果他们成功,您将无法继续进行恢复。 这是一场比赛! 我的build议是一次运行所有三个陈述。
- 设置path来恢复文件。
- 点击左侧的“选项”。
- 勾选checkbox – “closures与目标数据库的现有连接”。
- 点击OK。
希望这会起作用。
在恢复数据库之前执行此查询:
alter database [YourDBName] set offline with rollback immediate
这一次恢复后:
alter database [YourDBName] set online
在恢复数据库之前,使用以下脚本查找并终止所有打开的数据库连接。
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...'
希望这将有助于…
我想你只需要在尝试恢复之前将数据库设置为单用户模式,如下所示,只要确保使用的是master
USE master GO ALTER DATABASE AdventureWorksDW SET SINGLE_USER
对我来说,解决scheme是:
-
检查在左侧的光标选项卡上覆盖现有数据库(WITH REPLACE)。
-
取消所有其他选项。
-
select源和目标数据库。
-
点击确定。
而已。
这是我从数据库生产到开发的一种方式:
注:我通过SSAS工作来推动生产数据库每天发展:
第一步:删除开发中的前一天备份:
declare @sql varchar(1024); set @sql = 'DEL C:\ProdAEandAEXdataBACKUP\AE11.bak' exec master..xp_cmdshell @sql
第二步:复制生产数据库到开发:
declare @cmdstring varchar(1000) set @cmdstring = 'copy \\Share\SQLDBBackup\AE11.bak C:\ProdAEandAEXdataBACKUP' exec master..xp_cmdshell @cmdstring
第三步:通过运行.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;
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