とまと あんらいぷ…

エンジニアの活動記録とかつぶやきとか

GitHub

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

デッドロックの考え方と調査方法指針をまとめてみた

【デッドロック関係の調査の仕方】
SQL Server Management Studio(以下SSMS)の
管理>拡張イベント>セッション>system_health>package0.event_fileを開いて
[name]がxml_deadlock_reportとなっているものがデッドロックの情報。
ここを見て、だいたいのあたりを付ける。

また、以下のコマンドで、ログに出力することができる。実行されているSQLをコピペしたいときは有効にするとよい。
-- SQLServerログにデッドロックのログを出力する
DBCC TRACEON(1204,-1)
-- エラーログにデッドロックのログを出力する
DBCC TRACEON(3605,-1)
-- トレースフラグの設定確認
DBCC TRACESTATUS
SQL Serverログを有効にすると、管理>SQL Serverログ>現在 に、クエリが出力されるようになる。

【調査コマンド・ツール・SQLなど】
以下に、SSMSで叩くコマンドやツールを記載する

■コマンド
sp_who2 =>セッション、およびプロセスに関する情報を提供する。要するにブロッキングを見ることができる。
print @@trancount =>DBのトランザクション数を表示する

■ツール
利用状況モニタ => データベースを右クリック「利用状況モニタ」で起動する。SQLの利用状況が一覧表示される
SQL Server プロファイラ => SSMSのツール>SQL Server プロファイラ より起動 ログインユーザーでフィルタリングして、実行されているSQLを確認するなどに使う。デッドロック検出に関してはDeadlock Graph イベントを使う
  SS2014を使っていればこのイベントはsystem_healthに出力される。
  デッドロックの検出と終了
  https://technet.microsoft.com/ja-jp/library/ms178104(v=sql.105).aspx
設定方法(わかりやすい)
  http://d.hatena.ne.jp/seki-moto/20101117/DeadLock
グラフィカル表示されたサーバー プロセスIDは、「select * from sys.sysprocesses 」のhostname を検索して調べる
    
■SQL
以下のSQLはロック状況を出力する(sys.dm_tran_locksに情報が入ってる)
-----------------------------------------------------------------------
SELECT
resource_type AS type
,resource_associated_entity_id as entity_id
,( CASE WHEN resource_type = 'OBJECT' THEN
OBJECT_NAME( resource_associated_entity_id )
ELSE
( SELECT
OBJECT_NAME( OBJECT_ID )
FROM
sys.partitions
WHERE
hobt_id=resource_associated_entity_id )
END)
AS object_name
,request_mode AS request_mode
,request_type AS request_type
,request_status AS request_status
,request_session_id AS session_id
FROM
sys.dm_tran_locks
WHERE
resource_type <> 'DATABASE'
ORDER BY
request_session_id
-----------------------------------------------------------------------

【トランザクション・デッドロックに係る知識】
この辺りがざっくりまとまって良い
https://blogs.msdn.microsoft.com/jpsql/2012/06/27/609/

変換デッドロック防止のため、DBは、READ_COMMITTED_SNAPSHOT 設定をONにしている
http://higus70.seesaa.net/article/145227121.html

デッドロックが発生した場合、第三者の介入がなければそれを解消することはできない。
SQL Serverでは、Lock Managerというリソースがデッドロックの検出を行い、強制的に片方の要求をロールバックさせる。
デッドロック発生の検出を決める既定時間は5秒。
スポンサーサイト

テーマ:データベース - ジャンル:コンピュータ

次のページ

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。