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® SQL Server™ 上的進程的信息。這些進程可以是客戶端進程或系統進程。sysprocesses 只存儲在 master 數據庫中。
列名 數據類型 描述
spid smallint SQL Server 進程 ID 。
kpid smallint Microsoft Windows NT 4.0® 線程 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