错误 – 由于数据库正在使用而无法获得独占访问

我实际上是试图使一个脚本(在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议是一次运行所有三个陈述。

  1. 设置path来恢复文件。
  2. 点击左侧的“选项”。
  3. 勾选checkbox – “closures与目标数据库的现有连接”。 在这里输入图像说明
  4. 点击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是:

  1. 检查在左侧的光标选项卡上覆盖现有数据库(WITH REPLACE)。

  2. 取消所有其他选项。

  3. select源和目标数据库。

  4. 点击确定。

而已。

这是我从数据库生产到开发的一种方式:

注:我通过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