sql server 還原數據庫時提示數據庫正在使用,無法進行操作的解決方法


sql server 還原數據庫的時候,提示"因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權",無論我是重啟數據庫,還是重啟計算機,分離數據庫,都不能解決問題,多番嘗試后,並且查找資料之后,終於解決了該問題。 

 

一、利用SQL語句,殺死正在使用該數據庫的所有進程 代碼如下

還原數據庫出錯: ” 因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權 “ 的解決方案

在還原數據庫時 , 有時會提示因為數據庫正在使用,所以無法獲得對數據庫的獨占訪問權 !!
這時需要在還原數據庫前先殺死正在使用數據庫的線程 .

該解決方案用到了系統表中的 sysprocesses ,若要訪問 sysprocesses ,您必須定位到 master 數據庫。

以下是殺死正在使用 'testdb' 數據庫的線程 :

use master
declare @dbname varchar ( 20)
set @dbname = 'testdb'
declare @sql nvarchar ( 500)
declare @spid int --SPID 值是當用戶進行連接時指派給該連接的一個唯一的整數
set @sql = 'declare getspid cursor for select spid from sysprocesses where dbid=db_id(''' + @dbname + ''')'
exec ( @sql )
open getspid
fetch next from getspid into @spid
while @@fetch_status <>- 1-- 如果 FETCH 語句沒有執行失敗或此行不在結果集中。
begin
exec ( 'kill ' + @spid ) -- 終止正常連接
fetch next from getspid into @spid
end
close getspid
deallocate getspid

 

 

該SQL語句利用游標循環所有正在使用該數據庫的進程,並通過kill命令殺死進程。 

數據庫sysprocesses 表詳細說明

 

sysprocesses
sysprocesses 表中保存關於運行在 Microsoft&reg; SQL Server™ 上的進程的信息。這些進程可以是客戶端進程或系統進程。sysprocesses 只存儲在 master 數據庫中。

列名 數據類型 描述 
spid smallint SQL Server 進程 ID 。 
kpid smallint Microsoft Windows NT 4.0&reg; 線程 ID 。 
blocked smallint 分塊進程的進程 ID (spid) 。 
waittype binary(2) 保留。 
waittime int 當前等待時間(以毫秒為單位)。當進程不處於等待時,為 0 。 
lastwaittype nchar(32) 表示上次或當前等待類型名稱的字符串。 
waitresource nchar(32) 鎖資源的文本化表示法。 
dbid smallint 當前正由進程使用的數據庫 ID 。 
uid smallint 執行命令的用戶 ID 。 
cpu int 進程的累計 CPU 時間。無論 SET STATISTICS TIME ON 選項是 ON 還是 OFF ,都為所有進程更新該條目。 
physical_io int 進程的累計磁盤讀取和寫入。 
memusage int 當前分配給該進程的過程高速緩存中的頁數。一個負數,表示進程正在釋放由另一個進程分配的內存。 
login_time datetime 客戶端進程登錄到服務器的時間。對於系統進程,是存儲 SQL Server 啟動發生的時間。 
last_batch datetime 客戶端進程上次執行遠程存儲過程調用或 EXECUTE 語句的時間。對於系統進程,是存儲 SQL Server 啟動發生的時間。 
ecid smallint 用於唯一標識代表單個進程進行操作的子線程的執行上下文 ID 。 
open_tran smallint 進程的打開事務數。 
status nchar(30) 進程 ID 狀態(如運行、休眠等)。 
sid binary(85) 用戶的全局唯一標識符 (GUID) 。 
hostname nchar(128) 工作站的名稱。 
program_name nchar(128) 應用程序的名稱。 
hostprocess nchar(8) 工作站進程 ID 號。 
cmd nchar(16) 當前正在執行的命令。 
nt_domain nchar(128) 客戶端的 Windows NT 4.0 域(如果使用 Windows 身份驗證)或信任連接的 Windows NT 4.0 域。 
nt_username nchar(128) 進程的 Windows NT 4.0 用戶名(如果使用 Windows 身份驗證)或信任連接的 Windows NT 4.0 用戶名。 
net_address nchar(12) 指派給每個用戶工作站上的網絡接口卡唯一標識符。當用戶登錄時,該標識符插入 net_address 列。 
net_library nchar(12) 用於存儲客戶端網絡庫的列。每個客戶端進程都在網絡連接上進入。網絡連接有一個與這些進程關聯的網絡庫,該網絡庫使得這些進程可以建立連接。有關更多信息,請參見客戶端和服務器 Net-Library 。 
loginame nchar(128) 登錄名。 

二、利用SQL語句,斷開所有用戶鏈接,並回滾所有事務,具體SQL語句如下 

ALTER DATABASE [數據庫名稱] SET OFFLINE WITH ROLLBACK IMMEDIATE 

注意:

 1.SQL語句要在master數據庫下面執行

 2.查看是否清除干凈可以用如下sql語句 

select * from master..sysprocesses where dbid=db_id( '數據庫名稱')

(轉)https://www.cnblogs.com/jkqnb/p/5812393.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM