SQL Server中自動(dòng)抓取阻塞的詳細(xì)流程
背景
當(dāng)發(fā)數(shù)據(jù)庫(kù)生阻塞時(shí),可以通過(guò)SQL語(yǔ)句來(lái)獲取當(dāng)前阻塞的會(huì)話情況,可以得到下面的信息
說(shuō)明:會(huì)話55阻塞了會(huì)話53。兩個(gè)會(huì)話都執(zhí)行了update test set fid=10 where fid=0。
但我們也經(jīng)常碰到客戶(hù)生產(chǎn)環(huán)境出現(xiàn)阻塞,由于不會(huì)抓取或者沒(méi)有及時(shí)抓取,導(dǎo)致問(wèn)題發(fā)生后,由于沒(méi)有相關(guān)的信息,導(dǎo)致問(wèn)題不能定位的問(wèn)題。
為了能夠保留問(wèn)題發(fā)生的現(xiàn)場(chǎng),實(shí)際上可以通過(guò)SQL Server的擴(kuò)展事件來(lái)實(shí)現(xiàn)自動(dòng)抓取。
部署方式
前提
由于SQL SERVER對(duì)阻塞的跟蹤報(bào)告事件默認(rèn)是禁用的,需要通過(guò)執(zhí)行下面的SQL語(yǔ)句開(kāi)啟。
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é)果,表示修改成功。
配置
打開(kāi)Microsoft SQL SERVER Management Studio,點(diǎn)擊\擴(kuò)展事件\會(huì)話
在會(huì)話節(jié)點(diǎn),按右鍵選擇【新建會(huì)話】
輸入會(huì)話名稱(chēng)
并且勾選,來(lái)保證服務(wù)器啟動(dòng)時(shí),自動(dòng)啟動(dòng)擴(kuò)展事件。
選擇blocked_process_report事件
點(diǎn)【確認(rèn)】后,可以看到新建立的【阻塞】事件會(huì)話
啟動(dòng)會(huì)話
選擇【阻塞】事件會(huì)話,按右鍵彈出菜單,選擇【啟動(dòng)會(huì)話】
監(jiān)控會(huì)話
啟動(dòng)會(huì)話后,發(fā)生過(guò)阻塞后,就可以通過(guò)【監(jiān)控實(shí)時(shí)數(shù)據(jù)】來(lái)查看數(shù)據(jù)了
查看監(jiān)控結(jié)果
點(diǎn)擊阻塞的記錄,雙擊字段為blocked_process的值列,就可以看到通過(guò)腳本抓到的類(lèi)似的阻塞會(huì)話詳細(xì)信息。
問(wèn)題
但,這種方式抓取,從實(shí)際運(yùn)行情況來(lái)看,當(dāng)阻塞的會(huì)話超過(guò)2個(gè)時(shí),記錄的信息的會(huì)話不完整,存在丟失的問(wèn)題,需要注意。
打開(kāi)一個(gè)新的會(huì)話,同樣執(zhí)行update test set fid=10 where fid=0,用語(yǔ)句查詢(xún)時(shí),結(jié)果如下:
表示會(huì)話55阻塞了會(huì)話53,會(huì)話53阻塞了會(huì)話73。
但此時(shí)擴(kuò)展事件抓取的數(shù)據(jù),丟失了會(huì)話55的信息。只有會(huì)話53阻塞會(huì)話73的記錄。
附
• 查詢(xún)阻塞的SQL
SELECT t1.resource_type AS [鎖類(lèi)型], DB_NAME(resource_database_id) AS [數(shù)據(jù)庫(kù)名], t1.resource_associated_entity_id AS [阻塞資源對(duì)象], t1.resource_description as [資源描述信息], t1.request_mode AS [請(qǐng)求的鎖], t1.request_session_id AS [等待會(huì)話], t2.wait_duration_ms AS [等待時(shí)間], (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 [等待會(huì)話執(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 [等待會(huì)話執(zhí)行的SQL], t2.blocking_session_id AS [阻塞會(huì)話], (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 [阻塞會(huì)話執(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事件說(shuō)明
Blocked Process Report Event Class - SQL Server | Microsoft Learn
以上就是SQL Server中自動(dòng)抓取阻塞的詳細(xì)流程的詳細(xì)內(nèi)容,更多關(guān)于SQL Server自動(dòng)抓取阻塞的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SQL查詢(xún)效率注意事項(xiàng)小結(jié)
SQL查詢(xún)效率注意事項(xiàng)小結(jié),需要的朋友可以參考下。2011-12-12SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件步驟詳解
本文分步驟給大家詳細(xì)介紹了SQL Server 使用觸發(fā)器(trigger)發(fā)送電子郵件的方法,需要的朋友可以參考下2017-04-04SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法
本文主要介紹了SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05sql 判斷數(shù)據(jù)庫(kù),表,存儲(chǔ)過(guò)程等是否存在的代碼
sql下用了判斷各種資源是否存在的代碼,很實(shí)用。需要的朋友可以參考下。2009-12-12sql server遞歸子節(jié)點(diǎn)、父節(jié)點(diǎn)sql查詢(xún)表結(jié)構(gòu)的實(shí)例
本文通過(guò)實(shí)例給大家介紹了sql server遞歸子節(jié)點(diǎn)、父節(jié)點(diǎn)sql查詢(xún)表結(jié)構(gòu)的實(shí)例解析,非常不錯(cuò),具有參考借鑒價(jià)值,需要的的朋友參考下2017-02-02SQL?Server中row_number函數(shù)用法入門(mén)介紹
SQL?ROW_NUMBER函數(shù)是臨時(shí)值序列的非持久生成,并且在執(zhí)行查詢(xún)時(shí)會(huì)動(dòng)態(tài)計(jì)算該函數(shù),下面這篇文章主要給大家介紹了關(guān)于SQL?Server中row_number函數(shù)用法的相關(guān)資料,需要的朋友可以參考下2023-03-03java連接mysql數(shù)據(jù)庫(kù) java連接sql server數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了java連接mysql數(shù)據(jù)庫(kù),以及java連接sql server數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02限制MSSQL使用內(nèi)存的方法(針對(duì)內(nèi)存小的云主機(jī))
使用騰訊云Windows云服務(wù)器安裝SQL SERVER數(shù)據(jù)庫(kù),在我們使用的過(guò)程中,有時(shí)候在任務(wù)管理器發(fā)現(xiàn)SQL SERVE的進(jìn)程占用很高的內(nèi)存和CPU,本文介紹如何限制SQL SERVER內(nèi)存占用2023-08-08利用 SQL Server 過(guò)濾索引提高查詢(xún)語(yǔ)句的性能分析
本文就給大家介紹一下 Microsoft SQL Server 中的過(guò)濾索引功能,本文通過(guò)場(chǎng)景模擬分析給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-07-07