次の方法で共有


Azure SQL での拡張イベント

適用対象:Azure SQL DatabaseAzure SQL マネージド インスタンスFabric の SQL データベース

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

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

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

概要

拡張イベントをすぐに使い始めるのに役立つ 2 つのチュートリアル例があります。

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

ベスト プラクティス

データベース エンジンの正常性とワークロードのパフォーマンスに影響を与えることなく、拡張イベントを安全かつ確実に使用するには、次のベスト プラクティスを採用します。

  • event_file ターゲットを使用する場合:
    • セッションに追加されるイベントによっては、 event_file ターゲットによって生成されるファイルに機密データが含まれている場合があります。 不要な読み取りアクセスを許可しないように、ストレージ アカウントとコンテナーの RBAC ロールの割り当てとアクセス制御リスト (ACL) (継承されたアクセスを含む) を慎重に確認します。 最小特権の原則に従います。
    • イベント セッションを作成するデータベースやマネージド インスタンスと同じ Azure リージョンのストレージ アカウントを使用します。
    • ストレージ アカウントの冗長性を、データベースまたはエラスティック プール、またはマネージド インスタンスの冗長性に合わせます。 ローカル冗長リソースの場合は、LRS、GRS、または RA-GRS を使用します。 ゾーン冗長リソースの場合は、ZRS、GZRS、または RA-GZRS を使用します。 詳細については、「Azure Storage の冗長性」をご覧ください。
    • 以外の Hotは使用しないでください。
    • ストレージ アカウントの 階層型名前空間 を有効にしないでください。
  • データベース エンジンの再起動のたびに自動的に開始する継続的に実行されるイベント セッションを作成する場合 (フェールオーバーやメンテナンス イベントの後など)、イベント セッション オプション 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 Database、Fabric の SQL データベース、Azure SQL Managed Instance、および SQL Server でサポートされる拡張イベント ターゲットの詳細については、「 拡張イベントのターゲット」を参照してください。

Transact-SQL の違い

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

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

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

各プラットフォームのカタログ ビューの一覧については、「 拡張イベント カタログ ビュー」を参照してください。

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

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

各プラットフォームの DMV の一覧については、「 拡張イベントの動的管理ビュー」を参照してください。

一般的な DMV

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

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

次のクエリを使用して、使用可能なイベント、アクション、およびターゲットを取得できます。

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;

Permissions

プラットフォーム別の詳細な アクセス許可 については、アクセス許可を参照してください。

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

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

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

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

    Namespace Action
    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
  • コンテナーの SAS トークンを作成し、資格情報にトークンを格納します。

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

    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;

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