天天看點

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

使用profiler工具的deadlock graph事件,可以非常友善直覺的捕獲死鎖資訊。方法是:

開啟mssql profiler:開始 -> 運作 -> 鍵入profiler

建立deadlock graph trace:在profiler窗體中,開啟一個trace -> 顯示所有事件 -> 依次找到locks -> deadlocak graph -> 運作(詳情參見下面的截圖,按照字母标号依次點選)。

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

注意這裡我們僅trace這一個事件就好了,取消其他多餘與死鎖無關的事件。

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

當死鎖狀況發生時,profiler捕獲到死鎖資訊,繪制成deadlock graph圖,非常直覺的展示了死鎖的程序、犧牲的程序和争搶的資源。

接下來就是分析死鎖發生時的情況,參加如下截圖:

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

通過死鎖關系圖的展示,我們可以分析如下:

犧牲程序:圖中最左邊被×掉的64号程序是死鎖犧牲品,它申請到了test_deadlock2的x鎖,再申請test_deadlock1的x鎖時,被做為了犧牲品。

死鎖程序:圖中最右邊63号程序首先擷取到了test_deadlock1的x鎖,然後申請test_deadlock2的x鎖,但這個時候64号程序已經拿走了test_deadlock2的x鎖。系統選擇殺死64号程序(即64做為了犧牲品),讓63号程序成功擷取到test_deadlock2的x鎖,他是本次資源争搶的獲勝者。

争搶的資源:圖中中部是兩個程序争搶的資源,我們可以通過圖中資源的hobt id擷取表和索引名,方法如下:

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

雖然通過deadlock graph圖可以很清楚的分析出死鎖的關系,找到資源的争搶點,但是我個人推薦分析deadlock trace檔案的方式,這種方式更加簡單明了。我們需要首先儲存deadlock graph監控資訊到檔案,比如儲存到c:tempdeadlock_testing.trc,方法如下:

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

檔案儲存完畢以後的.trc為字尾的檔案其實就是xml類型的檔案,我們可以使用接下來的語句進行分析xml檔案:

執行的結果如下截圖:

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

從這個分析結果來看,我們可以非常清晰明了得到如下資訊:

死鎖與被死鎖程序:63和64号程序

死鎖發生時,兩個程序執行的語句

死鎖的類型:本例是x鎖

鎖定資源的對象和索引名

死鎖的兩個程序執行的語句塊是什麼

程序執行所在的主機

......

我們既可以将deadlock graph儲存為trace檔案,還可以将其儲存到trace表中,假如我們将這個捕獲到的死鎖資訊儲存到本地資料庫表test.dbo.deadlock_testing中,方法如下:

RDS SQL Server死鎖(Deadlock)系列之二使用Profiler捕獲死鎖問題引入Profiler捕獲死鎖死鎖測試死鎖分析阿裡雲RDS SQL Server最後總結

分析deadlock trace table方法與分析deadlock trace file類似,隻需要将分析語句中的data公用表示稍微修改即可:

如果你是阿裡雲rds sql server 2008r2使用者,請工單聯系阿裡雲,申請執行個體的profiler權限,然後即可按照本方法來自行排查;如果你是阿裡雲rds sql server 2012使用者,預設已經具備profiler權限,無需申請權限。

使用profiler捕獲死鎖資訊的方法比使用dbcc的方式更加靈活,直覺,一目了然。希望阿裡雲rds sql server客戶借助本系列文章都可以自己動起手來,分析死鎖,解決死鎖的問題。