検索
連載

【トレースフラグ 1204】──デッドロックの詳細情報を出力するSQL Serverトレースフラグレファレンス(20)

「Microsoft SQL Server」が稼働するデータベースシステムを運用する管理者に向け、「トレースフラグ」の活用を軸にしたトラブル対策のためのノウハウを紹介していきます。今回は「トレースフラグ1204の詳細と使い方」を解説します。

Share
Tweet
LINE
Hatena

SQL Serverトレースフラグレファレンス一覧

 本連載では、「Microsoft SQL Server(以下、SQL Server)」で発生するトラブル対策を踏まえた「SQL Serverのトレースフラグ」の使いこなしTipsを紹介していきます。

 今回は「トレースフラグ1204」の詳細と使い方を解説します。

 トレースフラグ1204は、デッドロックを調査するために必要な情報を得る設定です。SQL Serverの全バージョンに対応します。

 SQL Serverでよく発生するエラーの1つにデッドロックがあります。SQL Serverで利用するロック機構は、データ整合性を保つために必要なものです。行やテーブルなどデータベースを更新する際に矛盾が生じないようにします。

 ところが、アプリケーションの利用方法によってはいったんかかったロックを解除できず、デッドロックを起こします。デッドロックが発生すると関係したセッションのどれか1つがエラーとなり、アプリケーション側に通知が届きます。デッドロックを調査するために必要な情報をログに出力するよう、動作を変える設定が、トレースフラグ1204です。

 なお、トレースフラグ1204が実装された当初はエラーログにデッドロックの情報を出力するために、トレースフラグ3605を併せて設定しなければなりませんでした。現在はトレースフラグ1204の設定だけで十分です。

設定可能なスコープ

トレースフラグ1204
設定方法 可/不可 要/不要
スタートアップ
グローバルスコープ
セッションスコープ ×
クエリスコープ ×
トレースフラグ 3604/3605 不要

動作例

 図1は典型的なデッドロック発生シナリオです。アプリケーションが2つあり、それぞれ異なる行をロックしています。アプリケーション1と同2は相手がロックした行の開放を待っていますが、順番がまずく、膠着(こうちゃく)状態に陥ってしまいました。この状態を一般に「サイクルデッドロック」と呼びます。

図1
図1 2つのクエリがデッドロックを起こした様子

 トレースフラグ1204(と3605)を用いたログの出力結果が、図2です。図2ではデッドロックに関わったクエリの種類や獲得したロックの種類、最終的にデッドロックエラーになったセッションの情報などを確認できました。

図2
図2 デッドロックが発生した際のエラーログ出力

 トレースフラグ1204を使わない場合はアプリケーション側にのみデッドロックが発生したという情報が返ってきます。これだけではデッドロックの解析は難しいでしょう。トレースフラグ1204をセットすればデッドロックの状況が見えるようになります。これによって、アプリケーションの改修やSQL Server本体側のチューニングなどの見直し検討が可能になります。

 ※本Tipsは、Windows Server 2012 R2上に「SQL Server 2016 RTM」をインストールした環境で解説しています。

筆者紹介

内ヶ島 暢之(うちがしま のぶゆき)

ユニアデックス株式会社 NUL System Services Corporation所属。Microsoft MVP for Data Platform(2011〜)。OracleやSQL Serverなど商用データベースの重大障害や大型案件の設計構築、プリセールス、社内外の教育、新技術評価を担当。2016年IoTビジネス開発の担当を経て、現在は米国シリコンバレーにて駐在員として活動中。目標は生きて日本に帰ること。

椎名 武史(しいな たけし)

ユニアデックス株式会社所属。Microsoft MVP for Data Platform(2017〜)。入社以来 SQL Serverの評価/設計/構築/教育などに携わりながらも、主にサポート業務に従事。SQL Serverのトラブル対応で社長賞の表彰を受けた経験も持つ。休日は学生時代の仲間と市民駅伝に参加し、銭湯で汗を流してから飲み会へと流れる。


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る