欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SQL Server中自動抓取阻塞的詳細流程

 更新時間:2024年08月27日 11:10:25   作者:Archy_Wang_1  
當(dāng)來自應(yīng)用程序的第一個連接控制鎖而第二個連接需要相沖突的鎖類型時,將發(fā)生阻塞,其結(jié)果是強制第二個連接等待,而在第一個連接上阻塞,本文給大家詳細介紹了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)文章

最新評論