- - PR -
【デッドロック】オブジェクト名称の調べ方
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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] | ||||
|
投稿日時: 2005-06-07 17:24
トレースフラグの情報は [リソースの種類]:[DBID]:[リソースの情報]と並んでいます。 例えば RID であれば, [RID]:[DBID]:[ファイル番号]:[ページ番号]:[実際の行スロット] などです。 どこまで取得したいかによりますが, DBID から DB_NAME などのメタデータ関数を使用することは可能です。 例えば,Input Buf の Language Event から推測するというのはいかがでしょう? リアルタイムであれば,sp_lock なども有用です。 また,この辺が参考になるかと思います。 http://www.microsoft.com/japan/msdn/sqlserver/columns/webtech/webtech3.asp とりいそぎ。 | ||||
|
投稿日時: 2005-06-07 17:44
ご親切にしていただき、ありがとうございます。
言葉足らずでしたが、Input buf にはSp_ExecuteSql;1が出力されています。 これは、C#.NETからADO経由でDBアクセスしているからです。 Input bufにSQL文が表示されれば、ここまで困らずにすむのですが。。。 SQL2005は、Sp_ExecuteSqlの内容を表示するようにしてほしいものです。 デッドロックの発生箇所がある程度絞り込めたところで、sp_lockを挿入してみます。 DB_NAMEなど、解析できる部分についてはおっしゃるとおりです。 もしご存知でしたら、ページ番号からテーブル名を確認する方法はありませんか? | ||||
|
投稿日時: 2005-06-07 18:10
ページ番号やインデックス番号からテーブルを逆算したことがないので, アロケートまわりから少し考えて見ます。 もし,リアルタイムにサーバーを監視・アクセスできる状況にあるのでしたら, トレースフラグとあわせて,SQL プロファイラを利用すれば, こちらであればロックされているオブジェクトがよりわかりやすいと思います。 | ||||
|
投稿日時: 2005-06-07 22:43
こんなものもある。
| ||||
|
投稿日時: 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 未記入さん、情報ご提供ありがとうございました。 | ||||
|
投稿日時: 2005-06-07 23:40
スレッドのタイトルに製品名くらいいれればいいのになあ。
世の中にはSQLServerしかないと思っているのかしら。 | ||||
|
投稿日時: 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] これで,目的のオブジェクト名を取得することができます。 が, もっと効率のよい方法があるでしょうし, そもそもいつページ分割が行われて状況が変わるかわかりませんので, プロファイラを使用したほうがよい気がします。 必要な情報に絞ってトレースしてみてください。 |