SQL Server中自動抓取阻塞的詳細流程
背景
當(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)場,實際上可以通過SQL Server的擴展事件來實現(xiàn)自動抓取。
部署方式
前提
由于SQL SERVER對阻塞的跟蹤報告事件默認是禁用的,需要通過執(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,點擊\擴展事件\會話
在會話節(jié)點,按右鍵選擇【新建會話】
輸入會話名稱
并且勾選,來保證服務(wù)器啟動時,自動啟動擴展事件。
選擇blocked_process_report事件
點【確認】后,可以看到新建立的【阻塞】事件會話
啟動會話
選擇【阻塞】事件會話,按右鍵彈出菜單,選擇【啟動會話】
監(jiān)控會話
啟動會話后,發(fā)生過阻塞后,就可以通過【監(jiān)控實時數(shù)據(jù)】來查看數(shù)據(jù)了
查看監(jiān)控結(jié)果
點擊阻塞的記錄,雙擊字段為blocked_process的值列,就可以看到通過腳本抓到的類似的阻塞會話詳細信息。
問題
但,這種方式抓取,從實際運行情況來看,當(dāng)阻塞的會話超過2個時,記錄的信息的會話不完整,存在丟失的問題,需要注意。
打開一個新的會話,同樣執(zhí)行update test set fid=10 where fid=0,用語句查詢時,結(jié)果如下:
表示會話55阻塞了會話53,會話53阻塞了會話73。
但此時擴展事件抓取的數(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中自動抓取阻塞的詳細流程的詳細內(nèi)容,更多關(guān)于SQL Server自動抓取阻塞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件步驟詳解
本文分步驟給大家詳細介紹了SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件的方法,需要的朋友可以參考下2017-04-04sql 判斷數(shù)據(jù)庫,表,存儲過程等是否存在的代碼
sql下用了判斷各種資源是否存在的代碼,很實用。需要的朋友可以參考下。2009-12-12sql server遞歸子節(jié)點、父節(jié)點sql查詢表結(jié)構(gòu)的實例
本文通過實例給大家介紹了sql server遞歸子節(jié)點、父節(jié)點sql查詢表結(jié)構(gòu)的實例解析,非常不錯,具有參考借鑒價值,需要的的朋友參考下2017-02-02SQL?Server中row_number函數(shù)用法入門介紹
SQL?ROW_NUMBER函數(shù)是臨時值序列的非持久生成,并且在執(zhí)行查詢時會動態(tài)計算該函數(shù),下面這篇文章主要給大家介紹了關(guān)于SQL?Server中row_number函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2023-03-03java連接mysql數(shù)據(jù)庫 java連接sql server數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了java連接mysql數(shù)據(jù)庫,以及java連接sql server數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02限制MSSQL使用內(nèi)存的方法(針對內(nèi)存小的云主機)
使用騰訊云Windows云服務(wù)器安裝SQL SERVER數(shù)據(jù)庫,在我們使用的過程中,有時候在任務(wù)管理器發(fā)現(xiàn)SQL SERVE的進程占用很高的內(nèi)存和CPU,本文介紹如何限制SQL SERVER內(nèi)存占用2023-08-08