SQLのデッドロック情報をキャプチャして記録する


SQL Serverに付属のプロファイラーツールを使用してデッドロック情報を追跡できることはわかっています。しかし、この方法には大きな利点があります。つまり、消費量が多くなります。外国の神のテストによると、プロファイラーはサーバーの全帯域幅の35%を占めることさえあるので、ビジーなシステムでは、プロファイラーを使用することは明らかに良い考えではありません。2つ目は消費量が最も少なく、最もビジーなシステムでも使用できます。1つ目は最も柔軟性が高く、さまざまなアプリケーションに対応できます。

方法1:SQL Serverエージェント(アラート+ジョブ)

使用する特定の手順は次のとおりです

。1.最初に次のコマンドを使用して、関連するトレースフラグを有効にします。

SQLコード
 
DBCC TRACEON (3605,1204,1222,-1)  


説明:
3605は、DBCCの結果をエラーログに出力します。
1204デッドロックに参加しているロックのリソースとタイプ、および影響を受ける現在のコマンドを返します。
1222デッドロックに関係するリソースとロックのタイプ、および影響を受ける現在のコマンドを、XSDスキーマ(1204以降、SQL 2005以降で利用可能)に準拠していないXML形式で返します。
-1指定したトレースマークをグローバルにオンにします。

上記のトレースフラグのスコープはグローバルです。つまり、SQL Serverは、SQL Serverが再起動するまで、SQL Serverの動作中に引き続き役割を果たします。

SQL Serverが再起動後にこれらのフラグを自動的にオンにするようにしたい場合は、SQL Serverサービスの起動オプションの/ T起動オプションを使用して、起動時にトレースフラグがオンに設定されるように指定できます。(SQL Server構成マネージャー-> SQL Serverサービス-> SQL Server->プロパティ->詳細設定->起動パラメーターにあります)

上記のステートメントを実行した後、SQL Serverでデッドロックが発生すると、すでにエラーログに表示されています。到着しましたが、十分に直感的ではありません(他の情報と組み合わせて)。(SSMS-> SQL Serverインスタンス->管理-> SQL Serverログ)

2.デッドロックレコードを格納するテーブルを作成します。

SQLコード
 





USE [Cole]  --Cole是我的示例数据库,你可以根据实际情况修改。  
GO  
CREATE  TABLE  DeadLockLog (  
id  int  IDENTITY (1, 1)  NOT  NULL ,   
LogDate DATETIME,   
ProcessInfo  VARCHAR (10),   
ErrorText  VARCHAR ( MAX )  
GO  

 

3. JOBを

作成して新しいJOBを 作成し(名前はDeadLockJobと仮定)、「step」に新しいステップを作成し、ステップ名を書き込み、データベースを「Cole」にします(2.テーブルの作成を参照)。「command」フィールドに次のように入力します。ステートメント:

SQLコード

















--新建临时表  
IF OBJECT_ID( 'tempdb.dbo.#ErrorLog' IS  Not  Null  
DROP  TABLE  #ErrorLog  
 
CREATE  TABLE  #ErrorLog (Id  int  IDENTITY (1, 1)  NOT  NULL , a DATETIME, b  VARCHAR (10), c  VARCHAR ( MAX ))  
 
--将当前日志记录插入临时表  
INSERT  INTO  #ErrorLog  EXEC  master.dbo.sp_readerrorlog  
 
--将死锁信息插入用户表  
insert  DeadLockLog  
select  a, b, c   
from  #ErrorLog   
where  id >= ( select  MAX (id)  from  #ErrorLog  WHERE  Like  '%Deadlock encountered%'
  
DROP  TABLE  #ErrorLog  
  



4.新しいアラーム

[新しいアラーム]フォームの[全般]タブで、次の設定を行います。

名前:実際の状況に応じて名前を付けることができます。ここではDeadLockAlert
タイプを使用しています:[SQL Serverパフォーマンス状態アラーム]
オブジェクトを選択:SQLServer:ロック
カウンター:デッドロックの数/
秒例:_Total
カウンターは、次の条件が満たされたときにアラームをトリガーします:上記の
値:0

設定が完了すると、次の図のようになります。

[応答]タブで、[ジョブの実行]を選択し、ステップ3で作成したジョブ(つまり、DeadlockJob)を選択します。

ここでは、すべてのステップを完了しました。今後は、いつでもDeadLockLogテーブルをクエリして表示できますデッドロック情報。

方法2:サーバー側の追跡を使用します。

具体的な実装手順は次のとおりです

。1.次のスクリプトを記述して実行します

SQLコード



































-- 定义参数  
declare  @rc  int  
declare  @TraceID  int  
declare  @maxfilesize  bigint  
set  @maxfilesize = 5   
 
-- 初始化跟踪  
exec  @rc = sp_trace_create @TraceID  output , 0, N 'e:\DbLog\deadlockdetect' , @maxfilesize,  NULL   
--此处的e:\dblog\deadlockdetect是文件名(可自行修改),SQL会自动在后面加上.trc的扩展名  
if (@rc != 0)  goto  error  
 
-- 设置跟踪事件  
declare  @ on  bit  
set  @ on  = 1  
--下述语句中的148指的是locks:deadlock graph事件(参见sys.trace_events),12指的是spid列(参见sys.trace_columns)  
exec  sp_trace_setevent @TraceID, 148, 12, @ on    
exec  sp_trace_setevent @TraceID, 148, 11, @ on  
exec  sp_trace_setevent @TraceID, 148, 4, @ on  
exec  sp_trace_setevent @TraceID, 148, 14, @ on  
exec  sp_trace_setevent @TraceID, 148, 26, @ on  
exec  sp_trace_setevent @TraceID, 148, 64, @ on  
exec  sp_trace_setevent @TraceID, 148, 1, @ on  
 
-- 启动跟踪  
exec  sp_trace_setstatus @TraceID, 1  
 
-- 记录下跟踪ID,以备后面使用  
select  TraceID = @TraceID  
goto  finish  
 
error:   
select  ErrorCode=@rc  
 
finish:   
go  
  


上記のステートメントを実行した後、SQL Serverでデッドロックイベントが発生するたびに、レコードがファイルe:\ DbLog \ deadlockdetect.trcに自動的に挿入されます。

2.サーバー側のトラッキングを一時停止および停止

する上記のサーバー側のトラッキングを一時停止する場合は、次のステートメントを実行できます。

SQLコード

exec  sp_trace_setstatus 1, 0  --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停



上記のサーバー側のトラッキングを停止する場合は、次のステートメントを実行できます。

SQLコード

exec  sp_trace_setstatus 1, 2  --第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止



3.トレースファイルの内容を表示

する上記で生成されたトレースファイル(e:\ DbLog \ deadlockdetect.trc)の場合、2つの方法で表示できます:

1)。t-sqlコマンドを実行します。

SQLコード

select  from  fn_trace_gettable( 'e:\DbLog\deadlockdetect.trc' ,1)  


 
結果のTextData列は、デッドロックに関する詳細情報をXML形式で返します。

2)。SQL Serverプロファイラーで開きます。

プロファイラ->トレースファイルを開く-> e:\ DbLog \ deadlockdetect.trcの順に選択すると、デッドロック情報がグラフィック形式で表示されます。


元のテキスト:http : //bbs.csdn.net/topics/350234619


元の記事を22件公開 賞賛7件 100,000回以上の閲覧

おすすめ

転載: blog.csdn.net/qyx0714/article/details/63678740