SQL 系統進程的運行(status)狀態(Runnable、Running、Suspended、Sleeping、Pending、Dormant、Background、Spinlock)
1、狀態(status)解釋
- “pending”(等待),代表這個process,既沒有Thread可用,也沒有CPU可用,正在同時等待這兩項系統資源。
- “runnable”,代表這個process,有Thread可用,但沒有CPU可用,所以它正在等待CPU這項系統資源。
- “running”,代表這個process,有Thread可用,有CPU可用。
- “suspended”(暫停),代表這個process,正在「等待」別的process執行,等待的系統資源可能是Disk I/O或數據庫的Lock。(若這個process執行的SELECT沒加上NOLOCK關鍵字,而別的process正在進行「交易」或寫入(會加Lock),則這個SELECT的process就會呈現“suspended”的狀態。)
- “sleeping”,代表這個process,目前沒在做任何事,正在等待進一步的指令。(sleeping 代表建立了數據庫連接,但程序沒有發出SQL命令. 因為應用程序為了減少打開和關閉連接的開銷,在完成數據庫中的操作后,仍然保持數據庫的連接,這些連接的最主要目的是重用。)
- “dormant”(暫時擱置),代表SQL Server正在對這個process做reset。
- “background”,代表這個process正在SQL Server背景執行。即使你看到有很多“background”process正在執行,也不必擔心。
- “Spinlock”(自旋鎖),本質上意味着查詢處於某種運行模式,它在CPU中忙於等待自己的輪詢。
2、查看的幾種方式:
//1
SELECT * FROM sys.sysprocesses;
//2
EXEC sp_who2;
//3
SELECT sqltext.TEXT, req.session_id, req.status, req.command, req.cpu_time, req.blocking_session_id, req.total_elapsed_time
FROM sys.dm_exec_requests req (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext
3、sys.sysprocesses 主要字段解釋
- Spid:Sql Servr 會話ID
- Kpid:Windows 線程ID
- Blocked:正在阻塞求情的會話 ID。如果此列為 Null,則標識請求未被阻塞
- Waittype:當前連接的等待資源編號,標示是否等待資源,0 或 Null表示不需要等待任何資源
- Waittime:當前等待時間,單位為毫秒,0 表示沒有等待
- DBID:當前正由進程使用的數據庫ID
- UID:執行命令的用戶ID
- Login_time:客戶端進程登錄到服務器的時間。
- Last_batch:上次執行存儲過程或Execute語句的時間。對於系統進程,將存儲Sql Server 的啟動時間
- Open_tran:進程的打開事務個數。如果有嵌套事務,就會大於1
- Status:進程ID 狀態,dormant = 正在重置回話 ; running = 回話正在運行一個或多個批處理 ; background = 回話正在運行一個后台任務 ; rollback = 會話正在處理事務回滾 ; pending = 回話正在等待工作現成變為可用 ; runnable = 會話中的任務在等待獲取 Scheduler 來運行的可執行隊列中 ; spinloop = 會話中的任務正在等待自旋鎖變為可用 ; suspended = 會話正在等待事件完成
- Hostname:建立鏈接的客戶端工作站的名稱
- Program_name:應用程序的名稱,就是 連接字符串中配的 Application Name
- Hostprocess:建立連接的應用程序在客戶端工作站里的進程ID號
- Cmd:當前正在執行的命令
- Loginame:登錄名
4、檢查死鎖進程的方式
//方式1
declare @spid int,@bl int
DECLARE s_cur CURSOR FOR select 0 ,blocked from (select * from sys.sysprocesses where blocked>0 ) a
where not exists(select * from (select * from sys.sysprocesses where blocked>0 ) b where a.blocked=spid)
union
select spid,blocked from sys.sysprocesses where blocked>0 OPEN s_cur FETCH NEXT FROM s_cur INTO @spid,@bl WHILE @@FETCH_STATUS = 0
begin if @spid =0
select ' 引起數據庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + ' 進程號, 其執行的SQL 語法如下' else
select ' 進程號SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 進程號SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其當前進程執行的SQL 語法如下'
DBCC INPUTBUFFER (@bl ) FETCH NEXT FROM s_cur INTO @spid,@bl end CLOSE s_cur
DEALLOCATE s_cur
//方式2
use master
go
--檢索死鎖進程
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)
參考死鎖的解決方式:鏈接
創建時間:2022.02.15 更新時間:
