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 以外の 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 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やその他のAzureプラットフォーム・as a Service(PaaS)リソースの周囲にネットワークアクセスの境界を設定します。 論理サーバーをネットワークセキュリティペリメーター(NSP)に関連付けると、Extended EventsがAzure Storageに行うアウトバウンド接続は、そのペリメーターのアクセスルールの対象となります。

Note

ネットワークセキュリティ境界はAzure SQL Databaseのみで利用可能です。 このセクションはFabricのAzure SQL Managed InstanceやSQLデータベースには適用されません。 プレビュー機能として、ネットワークセキュリティ境界はMicrosoft Azureプレビューの補足利用規約の対象となります。

エクステンデッドイベントがネットワークアクセスを利用する方法

Extended Eventsは、データベース エンジンからAzure Storageへのアウトバウンド接続を2つのケースで行います。

  • イベントデータの書き込み。 ブロブを指すevent_fileターゲットでイベントセッションを開始すると、データベース エンジンはセッション開始前にアウトバウンドアクセスを確認し、そのたびにイベントバッファをブロブにフラッシュします。
  • イベントデータの読み取り。 sys.fn_xe_file_target_read_filesys.fn_MSxe_read_event_streamをBlob URLで呼び出すと、関数が初期化される際にデータベース エンジンはアウトバウンドアクセスをチェックします。 イベントビューアでキャプチャされたイベントデータを開くとSSMSが sys.fn_MSxe_read_event_stream 呼び出されます。

T-SQL経由でイベントセッションを管理するためのインバウンドTDS接続は、拡張イベント専用のNSP設定を必要としません。 CREATE EVENT SESSIONALTER EVENT SESSIONDROP EVENT SESSION文と読み取り関数はすべて通常のクライアント接続上で動作するため、他のクライアント接続と同様にインバウンドアクセスルールに従っています。

サポートされている構成

挙動は境界の アクセスモード 、ストレージアカウントが論理サーバーと同じ境界にあるかどうか、そして異なる境界が連結されているかどうかに依存します。

SQL論理サーバーNSP ストレージアカウントNSP Behavior
NSPなし NSPなし 境界は接続を評価しません。 Extended Eventsは、設定した認証情報とストレージアカウントのファイアウォールルールを使ってストレージアカウントに接続します。 詳細については、 ストレージコンテナの認可および制御を参照してください。
NSPなし NSPにおいて ペリメーターは論理サーバーからのアウトバウンドアクセスを評価しません。 接続が成功するかどうかは、ストレージアカウント自身の境界のインバウンドルールに依存します。
強制的なNSPにおいて 同じNSP アクセスは常に許可されています。 アウトバウンドルールは必要ありません。
NSP(強制適用)において 異なるが関連しているNSP クロスペリメータールールによりアクセスが許可されています。 アウトバウンドFQDNルールは必要ありません。
強制的なNSPにおいて 異なる未リンクのNSP、またはNSPなし 管理型IDを使う場合や、境界プロファイル内の送信FQDNルールがストレージアカウントのホスト名と一致する場合にアクセスが許可されます。 SASトークンを使用しルールマッチがない場合、イベントセッションはエラー25602で開始失敗し、read関数もエラー25759で失敗する可能性があります。
NSP(移行期)において Any 周辺はルールを評価・記録しますが、トラフィックを遮断することはありません。

ストレージアカウントへのアウトバウンドアクセスを設定する

拡張イベントを使用するようにデータベースを設定する際、 管理型ID 認証と SASトークン 認証のどちらかを選択できます。 選択した認証メカニズムによって、アウトバウンドアクセスルールが必要かどうかが決まります。

  1. 周囲の関連付けを確認してください。 Azureポータルで「Network Security Perimeter」を検索し、あなたの境界を選択し、設定メニューから「Associated Resources」を選択してサーバーがリストされているか確認してください。 詳細については、 ネットワークセキュリティ境界を参照してください。
  2. 認証の手段を選びましょう。 管理型ID認証を使いましょう。 マネージドIDトークンには、境界が必要なクレームが含まれているため、アウトバウンドルールを追加する必要がなく、次のステップを省略できます。
  3. アウトバウンドアクセスルール(SASトークンのみ)を追加してください。 SASトークンを使っていて、ペリメーターが強制モードなら、ペリメータープロファイルにアウトバウンドアクセスルールを追加してください。 例えば、 完全限定ドメイン名(FQDN) とストレージアカウントのホスト名を値として使うルールタイプを使いましょう。例えば myxedata.blob.core.windows.net

この例では、*.blob.core.windows.netを使ってすべてのAzure Storageアカウントを許可できますが、その設定は所有していないストレージアカウントへのアウトバウンド接続を許可します。 可能な限り特定のホスト名を使ってください。

どのアウトバウンドルールが必要か確認するまでは、周囲をトランジションモードに保ちましょう。 トランジションモードでは、ペリメーターがアクセスをブロックせずにルール評価を記録し、失敗を引き起こす前に抜けているルールを見つけることができます。 ルールが整ったら強制モードに切り替えてください。

制限と行動の違い

  • データベース エンジンはセッション開始時とバッファフラッシュのたびにアウトバウンドアクセスをチェックします。 セッション中にアウトバウンドルールを削除しても、セッションは停止しません。 代わりに個々のバッファ書き込みが失敗し始めます。
  • マネージドIDとSASトークンは境界線の下では同等ではありません。 マネージドIDトークンは周辺クレームを含んでいるため、アウトバウンドルールは必要ありません。 SASトークンにはこれらの主張がないため、強制モードで対応するアウトバウンドルールが必要です。
  • 読み込みがブロックされてもエラーが出ない場合があります。 周囲が sys.fn_xe_file_target_read_file または sys.fn_MSxe_read_event_streamをブロックすると、関数はエラー25759または25717を出すか、エラーなしで空の結果セットを返すことがあります。 データが返されるはずなのに行が返されず、エラーも表示されない場合は、アウトバウンドルールを確認してください。

境界がアクセスを遮断した場合のエラー

エラー25602は、周囲がストレージアカウントへの送信接続をブロックしたため、 event_file ターゲットが初期化できなかったことを意味します:

The target, "<target_name>", encountered a configuration error during initialization. Object cannot be added to the event session.
For more information, see https://go.microsoft.com/fwlink/?linkid=2336061.

エラー25759は、周囲が読み取り機能をブロックしたことを意味します:

Network Security Perimeter (NSP) blocked outbound access to the storage URL '<url>'.
The NSP configuration does not allow reading from the specified location.

エラー25717は、read関数が読み取っている間にアクセスが取り消されたことを意味します。 データベース エンジンはブロブデータをファイル全体をダウンロードするのではなくチャンク単位で読み取るため、このエラーは結果セットの途中で発生することがあります。

The operating system returned error <error details> while reading from the file '<url>'.

これらのエラーを解決するには、マネージドID認証に切り替えるか、ストレージアカウントのホスト名に合致するアウトバウンドFQDNルールを追加するか、ストレージアカウントを論理サーバーと同じ境界内に移動してください。

ターゲット初期化やバッファ書き込み失敗に関するより詳細な診断情報については、拡張イベントエンジンのログを検索してください:

SELECT CONVERT(xml, record) AS record_xml
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_XE_LOG';

境界の関連付けの変更やアクセスモードの変更は、論理サーバーのAzureアクティビティログに表示されます。 受信および送信のルール評価は ネットワークセキュリティ境界の診断ログに表示されます。

リソース ガバナンス

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;

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