- PR -

【デッドロック】オブジェクト名称の調べ方

投稿者投稿内容
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 2005-06-07 14:46
こんにちわ。
SQL Server の起動パラメータで、-T1204を追加してデッドロックの発生状況を監視しています。
起動パラメータで指定した出力ファイルに、「Deadlock encountered .... Printing deadlock information」に詳細情報が出力されています。

どのオブジェクトがデッドロック対象になったかは、
 KEY: 5:2061354508:2
 RID: 5:6:3914888:0
 PAG: 5:3:3284914
などの情報から解析すればよいと思うのですが、どのようにすればオブジェクト名称がでてくるか分かりません。
ご存知の方がいらっしゃいましたら、教えてください。よろしくお願いします。

余談ですが、dbccコマンドで、
 dbcc page (5,3,3284914,3)
などがありましたが、本当に必要なオブジェクト名称は表示してくれませんでした。
どうぞよろしくお願いします。

[Windows 2003 Server]
[SQL Server 2000 SP3]
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-07 17:24
引用:


どのオブジェクトがデッドロック対象になったかは、
 KEY: 5:2061354508:2
 RID: 5:6:3914888:0
 PAG: 5:3:3284914
などの情報から解析すればよいと思うのですが、




トレースフラグの情報は
[リソースの種類]:[DBID]:[リソースの情報]と並んでいます。

例えば RID であれば,
[RID]:[DBID]:[ファイル番号]:[ページ番号]:[実際の行スロット]
などです。

どこまで取得したいかによりますが,
DBID から DB_NAME などのメタデータ関数を使用することは可能です。
例えば,Input Buf の Language Event から推測するというのはいかがでしょう?

リアルタイムであれば,sp_lock なども有用です。

また,この辺が参考になるかと思います。
http://www.microsoft.com/japan/msdn/sqlserver/columns/webtech/webtech3.asp

とりいそぎ。
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 2005-06-07 17:44
ご親切にしていただき、ありがとうございます。

言葉足らずでしたが、Input buf にはSp_ExecuteSql;1が出力されています。
これは、C#.NETからADO経由でDBアクセスしているからです。
Input bufにSQL文が表示されれば、ここまで困らずにすむのですが。。。
SQL2005は、Sp_ExecuteSqlの内容を表示するようにしてほしいものです。

デッドロックの発生箇所がある程度絞り込めたところで、sp_lockを挿入してみます。

DB_NAMEなど、解析できる部分についてはおっしゃるとおりです。
もしご存知でしたら、ページ番号からテーブル名を確認する方法はありませんか?

TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-07 18:10
引用:

あきさんの書き込み (2005-06-07 17:44) より:

ページ番号からテーブル名を確認する方法はありませんか?




ページ番号やインデックス番号からテーブルを逆算したことがないので,
アロケートまわりから少し考えて見ます。

もし,リアルタイムにサーバーを監視・アクセスできる状況にあるのでしたら,
トレースフラグとあわせて,SQL プロファイラを利用すれば,
こちらであればロックされているオブジェクトがよりわかりやすいと思います。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-06-07 22:43
こんなものもある。
あき
ベテラン
会議室デビュー日: 2003/07/23
投稿数: 72
投稿日時: 2005-06-07 23:35
TLCさん、ありがとうございます。
SQLプロファイラのことをすっかり忘れていました。
昔、稼働中に実行して大変な目にあったもので。。。
ロック追跡のためのプロファイラは最後の手段にしようと思います。
以前、プロファイラを使ったときは、500件で約70秒の
バッチ処理が思った以上に遅くなりました。
プロファイラなし        70秒
SQLProfilerStandard.tdf(※1)120秒
CustomProfiler.tdf(※2)   660秒
※1…SQLProfilerStandard.tdf は、どのプロシージャが実行されたかトレース。
※2…CustomProfiler.tdf は、プロシージャの中身をstep by stepでトレース。
[環境]Microsoft SQL Server 2000 SP3

未記入さん、情報ご提供ありがとうございました。
未記人
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 70
投稿日時: 2005-06-07 23:40
スレッドのタイトルに製品名くらいいれればいいのになあ。
世の中にはSQLServerしかないと思っているのかしら。
TLC
大ベテラン
会議室デビュー日: 2005/05/31
投稿数: 152
お住まい・勤務地: 東京都
投稿日時: 2005-06-08 18:00
非常に効率が悪いですが,思いついたのでとりいそぎご報告を

【手順】
トレースフラグから情報を得る
[RID]:[DBID]:[ファイル番号]:[ページ番号]:[実際の行スロット]

SELECT DB_NAME([DBID])

でデータベースを特定する。

DBCC PAGE から情報を得る

DBCC TRACEON(3604)
DBCC PAGE([DBID],[ファイル番号],[ページ番号],[印刷オプション])

出力に m_objID が出されるので,
これを元に

SELECT [name] FROM [dbo].[sysobjects] WHERE [id]=[m_objID]

これで,目的のオブジェクト名を取得することができます。

が,
もっと効率のよい方法があるでしょうし,
そもそもいつページ分割が行われて状況が変わるかわかりませんので,
プロファイラを使用したほうがよい気がします。

必要な情報に絞ってトレースしてみてください。

スキルアップ/キャリアアップ(JOB@IT)