SQL Server中自動抓取阻塞的詳細(xì)流程
背景
當(dāng)發(fā)數(shù)據(jù)庫生阻塞時,可以通過SQL語句來獲取當(dāng)前阻塞的會話情況,可以得到下面的信息

說明:會話55阻塞了會話53。兩個會話都執(zhí)行了update test set fid=10 where fid=0。
但我們也經(jīng)常碰到客戶生產(chǎn)環(huán)境出現(xiàn)阻塞,由于不會抓取或者沒有及時抓取,導(dǎo)致問題發(fā)生后,由于沒有相關(guān)的信息,導(dǎo)致問題不能定位的問題。
為了能夠保留問題發(fā)生的現(xiàn)場,實(shí)際上可以通過SQL Server的擴(kuò)展事件來實(shí)現(xiàn)自動抓取。
部署方式
前提
由于SQL SERVER對阻塞的跟蹤報告事件默認(rèn)是禁用的,需要通過執(zhí)行下面的SQL語句開啟。
EXEC sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
EXEC sp_configure 'blocked process threshold', 10;
GO
RECONFIGURE;
GO
EXEC sp_configure 'blocked process threshold'執(zhí)行后,應(yīng)該看到下面的結(jié)果,表示修改成功。

配置
打開Microsoft SQL SERVER Management Studio,點(diǎn)擊\擴(kuò)展事件\會話

在會話節(jié)點(diǎn),按右鍵選擇【新建會話】

輸入會話名稱

并且勾選,來保證服務(wù)器啟動時,自動啟動擴(kuò)展事件。

選擇blocked_process_report事件

點(diǎn)【確認(rèn)】后,可以看到新建立的【阻塞】事件會話

啟動會話
選擇【阻塞】事件會話,按右鍵彈出菜單,選擇【啟動會話】

監(jiān)控會話
啟動會話后,發(fā)生過阻塞后,就可以通過【監(jiān)控實(shí)時數(shù)據(jù)】來查看數(shù)據(jù)了

查看監(jiān)控結(jié)果
點(diǎn)擊阻塞的記錄,雙擊字段為blocked_process的值列,就可以看到通過腳本抓到的類似的阻塞會話詳細(xì)信息。


問題
但,這種方式抓取,從實(shí)際運(yùn)行情況來看,當(dāng)阻塞的會話超過2個時,記錄的信息的會話不完整,存在丟失的問題,需要注意。
打開一個新的會話,同樣執(zhí)行update test set fid=10 where fid=0,用語句查詢時,結(jié)果如下:

表示會話55阻塞了會話53,會話53阻塞了會話73。
但此時擴(kuò)展事件抓取的數(shù)據(jù),丟失了會話55的信息。只有會話53阻塞會話73的記錄。

附
• 查詢阻塞的SQL
SELECT t1.resource_type AS [鎖類型], DB_NAME(resource_database_id) AS [數(shù)據(jù)庫名],
t1.resource_associated_entity_id AS [阻塞資源對象],
t1.resource_description as [資源描述信息], t1.request_mode AS [請求的鎖],
t1.request_session_id AS [等待會話], t2.wait_duration_ms AS [等待時間],
(SELECT [text] FROM sys.dm_exec_requests AS r WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle])
WHERE r.session_id = t1.request_session_id
) AS [等待會話執(zhí)行的批SQL],
(SELECT SUBSTRING(qt.[text],r.statement_start_offset/2,
(CASE WHEN r.statement_end_offset = -1
THEN LEN(CONVERT(nvarchar(max), qt.[text])) * 2
ELSE r.statement_end_offset END )/2)
FROM sys.dm_exec_requests AS r WITH (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(r.[sql_handle]) AS qt
WHERE r.session_id = t1.request_session_id
) AS [等待會話執(zhí)行的SQL],
t2.blocking_session_id AS [阻塞會話],
(SELECT [text] FROM sys.sysprocesses AS p
CROSS APPLY sys.dm_exec_sql_text(p.[sql_handle])
WHERE p.spid = t2.blocking_session_id
) AS [阻塞會話執(zhí)行的批SQL]
FROM sys.dm_tran_locks AS t1 WITH (NOLOCK)
INNER JOIN sys.dm_os_waiting_tasks AS t2 WITH (NOLOCK)
ON t1.lock_owner_address = t2.resource_address OPTION (RECOMPILE);• blocked-process-report事件說明
Blocked Process Report Event Class - SQL Server | Microsoft Learn
以上就是SQL Server中自動抓取阻塞的詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于SQL Server自動抓取阻塞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SQL Server 遠(yuǎn)程連接服務(wù)器詳細(xì)配置(sp_addlinkedserver)
這篇文章主要介紹了SQL Server 遠(yuǎn)程連接服務(wù)器詳細(xì)配置(sp_addlinkedserver),需要的朋友可以參考下2017-01-01
sql注入數(shù)據(jù)庫修復(fù)的兩種實(shí)例方法
這篇文章介紹了sql注入數(shù)據(jù)庫修復(fù)的兩種實(shí)例方法,有需要的朋友可以參考一下2013-09-09
完美解決SQL server2005中插入漢字變成問號的問題
以下是對在SQL server2005中插入漢字變成問號的解決辦法進(jìn)行了分析介紹。需要的朋友可以過來參考下2013-08-08
SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT詳解
這篇文章主要給大家介紹了關(guān)于SQL SERVER 2012新增函數(shù)之字符串函數(shù)FORMAT的相關(guān)資料,文中通過實(shí)例介紹的非常詳細(xì),對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
sql中varchar和nvarchar的區(qū)別與使用方法
經(jīng)常用varchar總發(fā)現(xiàn)從access數(shù)據(jù)庫直接轉(zhuǎn)到mssql數(shù)據(jù)庫默認(rèn)的都是nvarchar和ntext所以,找了一下,原來有這個說法。2008-01-01
SQL SERVER數(shù)據(jù)庫開發(fā)之存儲過程應(yīng)用
SQL SERVER數(shù)據(jù)庫開發(fā)之存儲過程應(yīng)用...2006-09-09
SQLSERVER調(diào)用C#的代碼實(shí)現(xiàn)
本文主要介紹了SQLSERVER調(diào)用C#的代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

