方法1:SQL Serverエージェント(アラート+ジョブ)
を使用する特定の手順は次のとおりです
。1.最初に次のコマンドを使用して、関連するトレースフラグを有効にします。
|
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.デッドロックレコードを格納するテーブルを作成します。
|
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」フィールドに次のように入力します。ステートメント:
|
--新建临时表
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
c
Like
'%Deadlock encountered%'
)
DROP
TABLE
#ErrorLog
|
4.新しいアラーム
[新しいアラーム]フォームの[全般]タブで、次の設定を行います。
名前:実際の状況に応じて名前を付けることができます。ここではDeadLockAlert
タイプを使用しています:[SQL Serverパフォーマンス状態アラーム]
オブジェクトを選択:SQLServer:ロック
カウンター:デッドロックの数/
秒例:_Total
カウンターは、次の条件が満たされたときにアラームをトリガーします:上記の
値:0
設定が完了すると、次の図のようになります。
[応答]タブで、[ジョブの実行]を選択し、ステップ3で作成したジョブ(つまり、DeadlockJob)を選択します。
ここでは、すべてのステップを完了しました。今後は、いつでもDeadLockLogテーブルをクエリして表示できますデッドロック情報。
方法2:サーバー側の追跡を使用します。
具体的な実装手順は次のとおりです
。1.次のスクリプトを記述して実行します
|
-- 定义参数
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.サーバー側のトラッキングを一時停止および停止
する上記のサーバー側のトラッキングを一時停止する場合は、次のステートメントを実行できます。
|
exec
sp_trace_setstatus 1, 0
--第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为0,即暂停
|
上記のサーバー側のトラッキングを停止する場合は、次のステートメントを実行できます。
|
exec
sp_trace_setstatus 1, 2
--第一个参数表示TraceID,即步骤1中的输出参数。第二个参数表示将状态改为2,即停止
|
3.トレースファイルの内容を表示
する上記で生成されたトレースファイル(e:\ DbLog \ deadlockdetect.trc)の場合、2つの方法で表示できます:
1)。t-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