一.Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)
本次測試使用數據庫實例SqlServer2008r2版
錯誤詳細:
標題: Microsoft SQL Server Management Studio
------------------------------
還原數據庫“Mvc_HNHZ”時失敗。 (Microsoft.SqlServer.Management.RelationalEngineTasks)
------------------------------
其他信息:
System.Data.SqlClient.SqlError: 因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權。 (Microsoft.SqlServer.SmoExtended)
原因分析:
在SqlServer2008r2中在還原數據庫時,在執行備份操作的時候,如果有正在訪問的用戶或者沒有關閉的數據庫鏈接,則還原失敗。
二、解決方案
解決方案1.
如果你使用管理工具還原數據庫并且在Microsoft SQL Server Management Studio 2016或以上版本的話,可以在還原的時候勾選"關閉到目標數據庫的現有鏈接"
解決方案2:
如果你的SqlServer Management Studio的版本比較低,可以設置數據庫為單用戶模式,執行完還原操作后,恢復為多用戶模式
設置方式:選中要還原的數據庫-->屬性-->選項-->限制訪問
該值從MULTI_USER修改為SINGLE_USER,此時該數據庫就會顯示為單用戶模式
這是GUI的模式,語句的辦法比較簡單
---設置數據庫為單用戶模式
USE MASTER
GO
ALTER DATABASE eol_tcgroup SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
---設置數據庫為多用戶模式
USE MASTER
GO
ALTER DATABASE eol_tcgroup SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
解決方案3:
完全使用T-Sql的方式,執行備份數據庫操作
use master
go
---聲明變量
declare @dbName nvarchar(max)='Mvc_HNHZ';
declare @dbFullName nvarchar(max)='E:\NewWork\Web\backup\test1.bak';
--1.1修改為單用模式
exec(N'ALTER DATABASE '+@dbName+' SET SINGLE_USER WITH ROLLBACK IMMEDIATE');
--1.2結束鏈接進程
DECLARE @kid varchar(max)
SET @kid=''
SELECT @kid=@kid+'KILL '+CAST(spid as Varchar(10)) FROM master..sysprocesses
WHERE dbid=DB_ID(@dbName) ;
EXEC(@kid) ;
--2.執行還原語句
restore database @dbName from disk=@dbFullName
with replace --覆蓋現有的數據庫
--3.重置數據庫為多用戶模式
exec(N'ALTER DATABASE '+@dbName+' SET MULTI_USER WITH ROLLBACK IMMEDIATE');