web-dev-qa-db-ja.com

過去のデッドロックに関する情報を表示する

デッドロックが原因でアプリケーションのジョブが失敗する問題を調査するという任務を負っています。トレースを使用してデッドロックをキャプチャすることは承知していますが、これは16時間前に発生したものであるため、デッドロックの原因を確認することが可能であるかどうかを知りたいですか?

ありがとう

1
Krishn

sp_BlitzLock で始めます。 SQL Server 2012以降の組み込みのシステムヘルス拡張イベントセッションを調べるのは、Erik Darlingによって書かれた無料のオープンソースストアドプロシージャです。

First Responder Kit Githubリポジトリ からダウンロードできます。

これをインストールするには、sp_BlitzLock.sqlを実行してストアドプロシージャをインストールしてから、次のコマンドを実行します。

EXEC sp_BlitzLock

最初の結果セットはデッドロックの詳細のセットで、2番目の結果セットは、デッドロックに最も一般的に関与しているアプリ、ユーザー、テーブルを調べる分析です。また、sp_BlitzCacheがクエリプランを分析するために使用するパラメーターと、sp_BlitzIndexが原因となる可能性のあるテーブルのインデックスの過剰および不足の問題を分析するためのパラメーターも提供します。

4
Brent Ozar

トレースフラグ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
0
LBooij