デッドロックが原因でアプリケーションのジョブが失敗する問題を調査するという任務を負っています。トレースを使用してデッドロックをキャプチャすることは承知していますが、これは16時間前に発生したものであるため、デッドロックの原因を確認することが可能であるかどうかを知りたいですか?
ありがとう
sp_BlitzLock で始めます。 SQL Server 2012以降の組み込みのシステムヘルス拡張イベントセッションを調べるのは、Erik Darlingによって書かれた無料のオープンソースストアドプロシージャです。
First Responder Kit Githubリポジトリ からダウンロードできます。
これをインストールするには、sp_BlitzLock.sqlを実行してストアドプロシージャをインストールしてから、次のコマンドを実行します。
EXEC sp_BlitzLock
最初の結果セットはデッドロックの詳細のセットで、2番目の結果セットは、デッドロックに最も一般的に関与しているアプリ、ユーザー、テーブルを調べる分析です。また、sp_BlitzCacheがクエリプランを分析するために使用するパラメーターと、sp_BlitzIndexが原因となる可能性のあるテーブルのインデックスの過剰および不足の問題を分析するためのパラメーターも提供します。
トレースフラグ1222(DBCC TRACEON(1222、-1))を有効にしている場合、エラーログからデッドロック情報を読み取ることができます。
次のクエリを使用すると、エラーログからすべてのデッドロック情報を読み取ることができます
declare @RawLogs table (id int IDENTITY (1, 1), logdate datetime, processinfo nvarchar(50), logtext nvarchar(max))
insert into @RawLogs
exec sp_readerrorlog
declare @results table (id int IDENTITY (1,1), logdate datetime, processinfo nvarchar(50), logtext nvarchar(max))
declare @ids table (id int, processinfo nvarchar(50))
insert into @ids
select id, processinfo
from @RawLogs
where logteXt = 'deadlock-list'
order by id
declare @Startid int, @endid int, @processinfo nvarchar(50)
select top 1 @Startid = id from @ids order by id
while(@@rowcount<>0)
begin
select @processinfo = processinfo from @ids where id = @Startid
select top 1 @endid = id from @ids where id > @Startid and processinfo = @processinfo order by id
insert into @results (logdate, processinfo, logtext)
select logdate, processinfo, logtext
from @RawLogs
where
id >=@Startid and
processinfo = @processinfo and
id < @endid
order by id
delete @ids where id = @Startid
select top 1 @Startid = id from @ids order by id
end
select logdate, processinfo, logtext
from @results
order by id