無法將數據庫從SINGLE_USER模式切換回MULTI_USER模式(Error 5064),及查找SQL Server數據庫中用戶spid(非SQL Server系統spid)的方法


今天公司SQL Server數據庫無意間變為SINGLE_USER模式了,而且使用如下語句切換回MULTI_USER失敗:

ALTER DATABASE [MyDB] SET MULTI_USER  WITH ROLLBACK IMMEDIATE 

報錯:

Msg 5064, Level 16, State 1, Line 1
Changes to the state or options of database 'MyDB' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.

該錯誤提示是有其它用戶在使用數據庫,沒辦法只好排查是誰:

 

1)通過sys.sysprocesses或者sys.dm_exec_sessions,或者存儲過程sp_who,然后用KILL命令把會話切斷

select * from sys.sysprocesses 
where spid > 50
And dbid=DB_ID ('MyDB')

這里解釋下為什么上面有spid > 50這個where條件:
50以下都是SQL Server系統自帶的進程。由於在windows之上SQL Server有一套自己的os,所以這些對於windows來說是線程的對於SQL Server os是進程。

 

需要注意的是spid > 50這個判斷條件只對SQL Server 2005及之后的版本有效,如果是SQL Server 2000,那么SQL Server系統的spid也是可能會大於50的,所以查找數據庫中用戶spid的最好方法是通過sys.dm_exec_sessions的is_user_process列,is_user_process值為1的spid都是用戶spid:

SELECT * FROM sys.dm_exec_sessions
WHERE is_user_process=1 AND database_id = DB_ID ('MyDB')

 

 

2)如果上面還是行不通,再檢查sys.dm_tran_locks,然后用KILL命令把會話切斷

select request_session_id as [spid],* from sys.dm_tran_locks where resource_database_id= DB_ID ('MyDB')

 

 

KILL 53

 


免責聲明!

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



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