天天看點

RDS SQL Server死鎖(Deadlock)系列之五利用Extended Events擷取死鎖資訊問題引入分析問題擷取曆史死鎖資訊

在過去很長一段時間,不斷有客人會問道:“在事先沒有任何跟蹤或者監控部署的情況下,阿裡雲rds sql server有沒有辦法擷取到曆史死鎖資訊,供我們分析?”。在寫到rds sql server死鎖系列文章之五時,我們就可以使用extended events來解決這個問題。

extended events是微軟從sql server 2008版本開始引入的,其中有一個預設事件會話是system_health,它的作用是用來收集sql server發生的錯誤資訊,以xml格式存儲在一個名為sys.dm_xe_session_targets的dmv中,這其中就包含了死鎖資訊。是以,我們可以利用這個dmv關聯另外一個名為sys.dm_xe_sessions的dmv來擷取死鎖資訊。

注意:存儲在這兩個dmv中的資訊會伴随sql server服務重新開機而消失。也就是說,我們無法擷取到sql server服務重新開機之前的曆史死鎖資訊。

為了描述清楚如何擷取曆史死鎖資訊,我們可以選擇其中任意一條死鎖資訊加以分析,代碼如下:

從執行查詢後的結果來看,我們成功拿到了曆史死鎖資訊(從時間字段來看,死鎖發生在8天以前),這些有用的資訊包含:鎖程序,死鎖程序,鎖的類型,執行的語句,登入使用者等資訊,如下截圖所示:

RDS SQL Server死鎖(Deadlock)系列之五利用Extended Events擷取死鎖資訊問題引入分析問題擷取曆史死鎖資訊

我們也可以打開這個死鎖資訊的xml,如下: