Azure SQL データベース と Azure SQL Managed Instance の拡張イベント

適用対象: Azure SQL データベース Azure SQL Managed Instance

拡張イベントの概要については、次を参照してください:

Azure SQL データベースと Azure SQL Managed Instance の拡張イベントの機能セット、機能、および使用シナリオは、SQL Server で使用できるシナリオと似ています。 主な違いは次のとおりです。

  • event_file ターゲットでは、ディスク上のファイルではなく、常に Azure Storage 内の BLOB が使用されます。
  • Azure SQL データベースでは、イベント セッションが、常にデータベース スコープです。 これは、次のことを意味します。
    • あるデータベースのイベント セッションは、他のデータベースのイベントを収集できません。
    • セッションに含めるユーザー データベースのコンテキストでイベントが発生する必要があります。
  • Azure SQL Managed Instance では、サーバー スコープとデータベース スコープの両方のイベント セッションを作成できます。 ほとんどのシナリオでは、サーバー スコープのイベント セッションを使用することをおすすめします。

作業の開始

Azure SQL データベースと Azure SQL Managed Instance の拡張イベントをすぐに使い始めるのに役立つ 2 つの例があります。

  • Azure Storage でevent_file ターゲットとのセッションを作成します。 この例では、event_file ターゲットを使用して Azure Storage のファイル (BLOB) 内のイベント データをキャプチャする方法を示します。 これは、キャプチャされたイベント データを保持する必要がある場合、または SQL Server Management Studio (SSMS) でイベント ビューアーを使用してキャプチャされたデータを分析する場合に使用します。
  • メモリ内に ring_buffer ターゲットを含むセッションを作成する。 この例では、ring_buffer ターゲットを使用してメモリ内のイベント セッションから最新のイベントをキャプチャする方法を示します。 これは、アドホック調査またはトラブルシューティング中に、キャプチャされたイベント データを格納せず、最近のイベントを簡単に確認する方法として使用できます。

拡張イベントを使用して、読み取り専用レプリカを監視できます。 詳細については、「レプリカでの読み取りクエリ」をご覧ください。

ベスト プラクティス

データベース エンジンの正常性とワークロードのパフォーマンスに影響を与えずに、Azure SQL データベースと Azure SQL Managed Instance で拡張イベントを確実に使用するには、次のベスト プラクティスを採用します。

  • event_file ターゲットを使用する場合:
    • イベント セッションを作成するデータベースやマネージド インスタンスと同じ Azure リージョンのストレージ アカウントを使用します。
    • ストレージ アカウントの冗長性を、データベースまたはエラスティック プール、またはマネージド インスタンスの冗長性に合わせます。 ローカル冗長リソースの場合は、LRS、GRS、または RA-GRS を使用します。 ゾーン冗長リソースの場合は、ZRS、GZRS、または RA-GZRS を使用します。 詳細については、「Azure Storage の冗長性」をご覧ください。
    • Hot 以外の BLOB アクセス層は使用しないでください。
  • データベース エンジンの再起動のたびに自動的に開始する継続的に実行されるイベント セッションを作成する場合 (フェールオーバーやメンテナンス イベントの後など)、イベント セッション オプション STARTUP_STATE = ONCREATE EVENT SESSION または ALTER EVENT SESSION ステートメントに含めます。
  • 逆に、アドホック トラブルシューティングで使用するなどの短期的なイベント セッションには、STARTUP_STATE = OFF を使用します。
  • Azure SQL データベースでは、組み込みの dl イベント セッションからデッドロック イベントを読み取りません。 多数のデッドロック イベントが収集されている場合は、sys.fn_xe_file_target_read_file() 関数を使用してそれらを読み取ると、master データベースでメモリ不足エラーが発生する可能性があります。 これにより、ログイン処理が影響を受け、アプリケーションが停止する可能性があります。 デッドロックを監視するための推奨される方法については、「拡張イベントを使用して Azure SQL データベースでデッドロック グラフを収集する」を参照してください。

イベント セッション ターゲット

Azure SQL データベースおよび Azure SQL Managed Instance では、次のターゲットはサポートされていません。

  • event_file ターゲット。 Azure Storage コンテナーの blob に完了したバッファーを書き込みます。
  • ring_buffer ターゲット。 新しいイベント データに置き換えられるまで、イベント データをメモリに保持します。
  • event_counter ターゲット。 拡張イベント セッション中に発生したすべてのイベントをカウントします。
  • ヒストグラム ターゲット。 別々のバケット内のフィールドまたはアクションの異なる値の出現回数をカウントします。
  • event_stream。 .NET アプリケーションにイベント データをストリーミングします。

Note

Azure SQL データベースと Azure SQL Managed Instance の event_stream ターゲットはプレビュー段階です。

Transact-SQL の相違点

SQL Server および Azure SQL Managed Instance で CREATE EVENT SESSIONALTER EVENT SESSIONDROP EVENT SESSION ステートメントを実行するときは、ON SERVER 句を使用します。 Azure SQL データベースでは、代わりに ON DATABASE 句を使用します。これは、Azure SQL データベースのイベント セッションがデータベース スコープであるためです。

拡張イベント カタログ ビュー

拡張イベントは、さまざまなカタログ ビューを提供します。 カタログ ビューでは、イベント セッションのメタデータまたは定義について説明します。 ビューでは、アクティブなイベント セッションのインスタンスに関する情報は返されません。

カタログ ビューの名前 説明
sys.database_event_session_actions イベント セッションの各イベントのアクションごとに 1 行のデータを返します。
sys.database_event_session_events イベント セッションのイベントごとに行を返します。
sys.database_event_session_fields イベントとターゲットに明示的に設定されたカスタマイズ可能な列ごとに行を返します。
sys.database_event_session_targets イベント セッションのイベント ターゲットごとに 1 行のデータを返します。
sys.database_event_sessions データベース内のイベント セッションごとに行を返します。

拡張イベントの動的管理ビュー

拡張イベントは、さまざまな動的管理ビュー (DMV) を提供します。 DMV は、開始されたイベント セッションに関する情報を返します。

DMV の名前 説明
sys.dm_xe_database_session_event_actions イベント セッション アクションに関する情報を返します。
sys.dm_xe_database_session_events セッション イベントに関する情報を返します。
sys.dm_xe_database_session_object_columns セッションにバインドされたオブジェクトの構成値を示します。
sys.dm_xe_database_session_targets セッション ターゲットに関する情報を返します。
sys.dm_xe_database_sessions 現在のデータベース内で実行しているイベント セッションごとに行を返します。

一般的な DMV

Azure SQL データベース、Azure SQL Managed Instance、および Microsoft SQL Server に共通した、追加の拡張イベント DMV も存在します:

使用可能なイベント、アクション、ターゲット

SQL Server と同様に、次のクエリを使用して、使用可能なイベント、アクション、ターゲットを取得できます:

SELECT o.object_type,
       p.name AS package_name,
       o.name AS db_object_name,
       o.description AS db_obj_description
FROM sys.dm_xe_objects AS o
INNER JOIN sys.dm_xe_packages AS p
ON p.guid = o.package_guid
WHERE o.object_type IN ('action','event','target')
ORDER BY o.object_type,
         p.name,
         o.name;

アクセス許可

ヒント

2022 年に、Microsoft は拡張イベントに対してより詳細なアクセス許可を多数導入しました。詳細については、「 ブログ: Sql Server 2022 と Azure SQL の新しい詳細なアクセス許可」を参照して、PoLP への準拠を向上させます

Azure SQL データベースと Azure SQL Managed Instance では、拡張イベントは詳細なアクセス許可モデルをサポートします。 次のアクセス許可が付与できます:

CREATE ANY DATABASE EVENT SESSION
DROP ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION ADD EVENT
ALTER ANY DATABASE EVENT SESSION DROP EVENT
ALTER ANY DATABASE EVENT SESSION ADD TARGET
ALTER ANY DATABASE EVENT SESSION DROP TARGET
ALTER ANY DATABASE EVENT SESSION ENABLE
ALTER ANY DATABASE EVENT SESSION DISABLE
ALTER ANY DATABASE EVENT SESSION OPTION

これらの各アクセス許可が制御するものについては、「CREATE EVENT SESSION」、「ALTER EVENT SESSION」、および「DROP EVENT SESSION」 をご覧ください。

これらのアクセス許可はすべて、データベースまたはマネージド インスタンスの CONTROL 権限に含まれます。 Azure SQL データベースでは、データベース所有者 (dbo)、db_owner データベース ロールのメンバー、および論理サーバーの管理者は、データベース CONTROL 権限を持ちます。 Azure SQL Managed Instance では、サーバー ロールのメンバーが sysadmin インスタンスに対する CONTROL アクセス許可を保持します。

ストレージ コンテナーの承認と制御

event_file ターゲットを使用すると、イベント データは Azure Storage コンテナー内の BLOB に格納されます。 イベント セッションを実行するデータベース エンジンには、このコンテナーへの特定のアクセス権が必要です。 このアクセス権は、次のいずれかの方法で付与できます。

  • Storage BLOB データ共同作成者 RBAC ロールをコンテナー上の Azure SQL 論理サーバーまたは Azure SQL マネージド インスタンスの管理 IDに割り当て、認証にマネージド ID を使用するようにデータベース エンジンに指示する資格情報を作成します。

    Storage BLOB データ共同作成者 RBAC ロールを割り当てる代わりに、次の RBAC アクションを割り当てることができます。

    名前空間 アクション
    Microsoft.Storage/storageAccounts/blobServices/containers/ read
    Microsoft.Storage/storageAccounts/blobServices/containers/blobs/ delete
    Microsoft.Storage/storageAccounts/blobServices/containers/blobs/ read
    Microsoft.Storage/storageAccounts/blobServices/containers/blobs/ write

    Note

    拡張イベント セッションでのマネージド ID の使用はプレビュー段階です。

  • コンテナーの SAS トークン を作成し、トークンを credential に格納します。

    Azure SQL データベースでは、データベース スコープの資格情報を使用する必要があります。 Azure SQL Managed Instance で、サーバー スコープの資格情報を使用します。

    Azure Storage コンテナー用に作成する SAS トークンは、次の要件を満たす必要があります。

    • rwdl (ReadWriteDeleteList) のアクセス許可を持ちます。
    • イベント セッションの有効期間に渡る開始時間と有効期限を持つ。
    • IP アドレスの制限がない。

リソース管理

Azure SQL Database では、リソースの競合を最小限に抑えるために、拡張イベント セッションによるメモリ消費量がデータベース エンジンによって動的に制御されます。

イベント セッションで使用できるメモリには制限があります。

  • 単一データベースでは、セッション メモリの合計は 128 MB に制限されます。
  • エラスティック プールでは、個々のデータベースは単一データベースの制限によって制限され、合計で 512 MB を超えることはできません。

メモリ制限を参照するエラー メッセージが表示される場合、実行できる修正措置は次のとおりです:

  • 同時実行するイベント セッションを減少させる。
  • イベント セッションに CREATE および ALTER ステートメントを使用して 、セッションの MAX_MEMORY 句で指定するメモリの量を減らします。

Note

拡張イベントでは、MAX_MEMORY 句は2 つのコンテキストで表示されます (セッションを作成または変更するとき (セッション レベル)、ring_buffer ターゲットを使用するとき (ターゲット レベル))。 上記の制限は、セッション レベルのメモリに適用されます。

Azure SQL Database で開始されるイベント セッションの数には上限があります:

  • 単一データベースでの制限は 100 です。
  • エラスティック プールでの制限は、プールあたり 100 データベース スコープ セッションです。

高密度エラスティック プールでは、開始されたセッションの合計数が 100 を下回っていても、メモリの制約により、新しい拡張イベント セッションの開始が失敗する可能性があります。

イベント セッションによって消費されたメモリの合計を見つけるには、イベント セッションが開始されたデータベースに接続しているときに次のクエリを実行します:

SELECT name AS session_name,
       total_buffer_size + total_target_memory AS total_session_memory
FROM sys.dm_xe_database_sessions;

エラスティック プールのイベント セッション メモリの合計を見つけるには、プール内のすべてのデータベースでこのクエリを実行する必要があります。