sqlserver日誌默認沒有記錄死鎖的。所以如果沒有提前配置監控的情況下,你無法找到死鎖的日誌進行定位。所以大家有時候會看到別人文章裏寫什麼事務日誌,擴展事件等方式去查找歷史的sqlserver出現的死鎖原因這是沒有辦法的。
所以,提前配置死鎖監控很重要。
死鎖監控配置
(1)sqlserver日誌監控
打開1222和1204跟蹤,這樣子死鎖的信息會記錄在error log中。這樣子可以通過存儲過程xp_readerrorlog進行查看。
首先,打開死鎖監控
dbcc traceon (1222,-1)
dbcc traceon (1204,-1)
然後,就可以等待死鎖再次發生,如果再次發生,則可以通過存儲過程查詢。
exec xp_readerrorlog
這個存儲過程是有參數的,如果你沒有寫參數,他默認查詢的是sqlserve日誌編號爲0(當前的日誌文檔,不是當天,指的是前一一個文件的時間節點到當前時間的所有日誌)的日誌。
如果你想選擇參數,從左往右是一共6個,如下解釋
1)日誌編號——整型,如下圖所示的編碼,一次只能指定一個編號 ,不能多個。
2)查找的日誌類型——整型,1是sqlserver的日誌,2是sqlserver代理日誌。
3)要查找的字符串,用雙引號包着。——字符串
4)要查找的字符串——字符串,3和4沒有區別,也就是你規定兩個要查找的字符串,如果你只需要查找一個,第二個寫NULL就可以。
5)查詢的開始日期——字符串,格式是YYYY-MM-DD hh:mm:ss
6)查詢的結束日期——字符串,格式是YYYY-MM-DD hh:mm:ss
直接給一個示例(參數一定要用雙引號引着,要不然會報錯)
exec xp_readerrorlog 1,1,"deadlock",null,"2019-05-01 00:00:00","2019-06-01"
(2)XEvent的session監控
在XEvent(擴展事件)配置死鎖監控的一個session。然後開啓session就可以監控了。
那如何新建一個Session呢?
右鍵選中會話,單擊【新建會話嚮導】
不使用任何模板
本來到輸入deadlock進行選擇的地方就可以停下來,但是個人建議一定要用文件的形式存儲,勾選了【啓用文件滾動更新】可以在空間不足時新日誌直接記錄覆蓋,保證最新的死鎖日誌文件存儲在系統中。
配置死鎖監控
當然,如果你的死鎖是可以重現的,那你可以用以下方法進行跟蹤:
【工具】->【sql server profile】
出來的界面就可以實時監控是否有死鎖,而且如果有死鎖的話,可以直接以圖形化的方式顯示出來,非常的友好。