无法恢复数据库备份,因为它被其他连接访问

SQL*_*ini 5 sql-server restore

--first command

use master

Go
-- second command
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE 

Go 
-- Third command
RESTORE DATABASE [MyDB] FROM  DISK = N'D:\Restore_Backup\Restore_05042015\AcctDB.bak' 
WITH  FILE = 1,  
MOVE N' AcctDB ' 
TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\WFStageAcct.mdf',  
MOVE N' AcctDB _log' 
TO N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\WFStageAcct_log.ldf',  
NOUNLOAD,  
REPLACE,  
STATS = 10

GO

--forth command

ALTER DATABASE MyDB SET MULTI_USER 

Go
Run Code Online (Sandbox Code Playgroud)

我运行上面的命令,一一恢复不同服务器上的数据库。但是有时我更改为单用户模式后无法恢复数据库,因为它被其他连接访问。如果我运行除了最后一部分之外的整个脚本会阻止其他连接,所以我将成为唯一的用户?

Mat*_*att 6

一次运行这一切并不能保证在您将其置于单用户模式和您开始恢复之间没有人会打开连接。相反,您可以将数据库置于离线模式而不是单用户模式以避免此问题。

例如

ALTER DATABASE MyDB SET OFFLINE WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)


Kin*_*hah 6

我只是稍微修改一下你的脚本。添加一个waitfor delay. 此外,请确保启用即时文件初始化以减少恢复时间。

--first command
use master
go

-- second command
alter database MyDB    
set OFFLINE with rollback IMMEDIATE -- single_user might give you issues if sql agent connects and grabs the only connection. Offline is more preferred.
waitfor delay '00:00:05' -- 5 sec delay .. no other spid takes our space !

-- Third command
restore database [MyDB]
from disk = N'D:\Restore_Backup\Restore_05042015\AcctDB.bak'
with file = 1
    ,move N' AcctDB ' to N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\WFStageAcct.mdf'
    ,move N' AcctDB _log' to N'D:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\WFStageAcct_log.ldf'
    ,NOUNLOAD
    ,REPLACE
    ,STATS = 10


-- Fourth command
alter database MyDB   
set MULTI_USER with rollback IMMEDIATE
go
Run Code Online (Sandbox Code Playgroud)