在過去很長一段時間,不斷有客人會問道:“在事先沒有任何跟蹤或者監控部署的情況下,阿裡雲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天以前),這些有用的資訊包含:鎖程序,死鎖程序,鎖的類型,執行的語句,登入使用者等資訊,如下截圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuUzNhVmY5UzY3YTYldDM4YWY2EzMlFWY0gTZyETY1M2MvwVbvNmLj5Wat4Wd5lGbh5iY1BXLn1WauU3bop3ZuFGat42YucWbp1iMhRXYvw1LcpDc0RHaiojIsJye.png)
我們也可以打開這個死鎖資訊的xml,如下: