問題描述:
Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)
數據庫還原的時候還有其他進程連在上面,導致無法獲得獨占造成的。
這個問題的原因在於有用戶連接了當前要做還原的數據庫,這里的用戶甚至包括當前要做還原的用戶。
解決辦法:
方法一:
刪完進程馬上有新的進程連進來,導致一直失敗。
單用戶模式
單用戶模式設置:
右鍵點擊數據庫 -> 屬性 -> 選項 -> 狀態 -> 限制訪問(MULTI_USER 默認) -> 選擇Single-> 確定。然后還原。
或 GUI的模式,語句的辦法比較簡單
USE MASTER GO ALTER DATABASE 庫名 SET SINGLE_USER WITH ROLLBACK IMMEDIATE; --單用戶模式 GO
ALTER DATABASE 庫名 SET MULTI_USER WITH ROLLBACK IMMEDIATE; --多用戶模式
GO
設置單用戶數據庫必須要超級用戶
方法二:
利用SQL語句,殺死正在使用該數據庫的所有進程,sql代碼如下:
殺掉正在運行的進程:
--殺死正在使用該數據庫的所有進程 declare @dbname varchar(50) set @dbname='數據庫名' declare @sql varchar(50) declare cs_result cursor local for select 'kill '+cast(spid as varchar(50)) from sys.sysprocesses where db_name(dbid)=@dbname open cs_result fetch next from cs_result into @sql while @@fetch_status=0 begin execute(@sql) fetch next from cs_result into @sql end close cs_result deallocate cs_result
該SQL語句利用游標循環所有正在使用該數據庫的進程,並通過kill命令殺死進程。
方法三:
將當前需要還原的數據進行OFFLINE,還原后,再將該數據庫ONLINE。
腳本如下,先運行第一腳本,還原成功后,運行第二腳本。
1)ALTER DATABASE [datebase] SET OFFLINE WITH ROLLBACK IMMEDIATE 2)ALTER DATABASE [datebase] SET ONLINE WITH ROLLBACK IMMEDIATE
如果此時還原還是不行。可能是刪完進程馬上有新的進程連進來,
導致一直失敗。應用程序一直不停的進行數據庫鏈接。
這時,可以在單用戶下還原。