

# Amazon RDS for Microsoft SQL Server で拡張イベントを使用する
<a name="SQLServer.ExtendedEvents"></a>

Microsoft SQL Server の拡張イベントを使用して、Amazon RDS for SQL Server のデバッグおよびトラブルシューティング情報をキャプチャできます。拡張イベントは、Microsoft によって非推奨にされている SQL Trace と Server Profiler を置き換えます。拡張イベントは、プロファイラートレースに似ていますが、トレースされるイベントをより細かく制御できます。拡張イベントは、Amazon RDS で SQL Server バージョン 2016 以降でサポートされています。詳細については、Microsoft のドキュメントの「[Extended events overview](https://docs.microsoft.com/en-us/sql/relational-databases/extended-events/extended-events)」を参照してください。

Amazon RDS for SQL Server のマスターユーザー特権を持つユーザーの場合、拡張イベントは自動的にオンになります。

**Topics**
+ [制限と推奨事項](#SQLServer.ExtendedEvents.Limits)
+ [RDS for SQL Server での拡張イベントの設定](#SQLServer.ExtendedEvents.Config)
+ [マルチ AZ 配置に関する考慮事項](#SQLServer.ExtendedEvents.MAZ)
+ [拡張イベントファイルのクエリ](#SQLServer.ExtendedEvents.Querying)

## 制限と推奨事項
<a name="SQLServer.ExtendedEvents.Limits"></a>

RDS for SQL Server で拡張イベントを使用する場合、次の制限が適用されます。
+ 拡張イベントは、Enterprise エディションと Standard エディションでのみサポートされます。
+ デフォルトの拡張イベントセッションは変更できません。
+ セッションメモリのパーティションモードを `NONE` に設定してください。
+ セッションイベント保持モードは、`ALLOW_SINGLE_EVENT_LOSS` または `ALLOW_MULTIPLE_EVENT_LOSS` のいずれかになります。
+ Event Tracing for Windows (ETW) ターゲットはサポートされていません。
+ ファイルターゲットが `D:\rdsdbdata\log` ディレクトリにあることを確認します。
+ ペアが一致するターゲットの場合は、`respond_to_memory_pressure` プロパティを `1` に設定します。
+ リングバッファーターゲットメモリは 4 MB を超えることはできません。
+ 次のアクションはサポートされていません。
  + `debug_break`
  + `create_dump_all_threads`
  + `create_dump_single_threads`
+ `rpc_completed` イベントは、15.0.4083.2、14.0.3370.1、13.0.5865.1、12.0.6433.1、11.0.7507.2 以降のバージョンでサポートされています。

## RDS for SQL Server での拡張イベントの設定
<a name="SQLServer.ExtendedEvents.Config"></a>

RDS for SQL Server では、拡張イベントセッションの特定のパラメータ値を設定できます。次の表では、設定可能なパラメータについて説明しています。


| パラメータ名 | 説明 | RDS デフォルト値 | 最小値 | 最大値 | 
| --- | --- | --- | --- | --- | 
| xe\$1session\$1max\$1memory | イベントバッファリングのためにセッションに割り当てるメモリの最大量を指定します。この値は、イベントセッションの max\$1memory 設定に対応しています。 | 4 MB | 4 MB | 8 MB | 
| xe\$1session\$1max\$1event\$1size | 大きなイベントで許可される最大メモリサイズを指定します。この値は、イベントセッションの max\$1event\$1size 設定に対応しています。 | 4 MB | 4 MB | 8 MB | 
| xe\$1session\$1max\$1dispatch\$1latency | 拡張イベントセッションターゲットにディスパッチされるまでにイベントがメモリにバッファされる時間を指定します。この値は、イベントセッションの max\$1dispatch\$1latency 設定に対応しています。 | 30 秒 | 1 秒 | 30 秒 | 
| xe\$1file\$1target\$1size | ファイルターゲットの最大サイズを指定します。この値は、ファイルターゲットの max\$1file\$1size 設定に対応します。 | 100 MB | 10 MB | 1 GB | 
| xe\$1file\$1retention | イベントセッションのファイルターゲットによって生成されたファイルの保存期間を日単位で指定します。 | 7 日間 | 0 日 | 7 日間 | 

**注記**  
`xe_file_retention` をゼロに設定すると、これらのファイルのロックが SQL Server によって解放された後、.xel ファイルが自動的に削除されます。ロックは、.xel ファイルが `xe_file_target_size` で設定されたサイズ制限に達すると解放されます。

`rdsadmin.dbo.rds_show_configuration` ストアドプロシージャを使用して、これらのパラメータの現在の値を表示できます。例えば、`xe_session_max_memory` の現在の設定を表示するには、次の SQL 文を使用します。

```
exec rdsadmin.dbo.rds_show_configuration 'xe_session_max_memory'
```

`rdsadmin.dbo.rds_set_configuration` ストアドプロシージャを使用して変更することができます。例えば、`xe_session_max_memory` を 4 MB に設定するには、次の SQL ステートメントを使用します。

```
exec rdsadmin.dbo.rds_set_configuration 'xe_session_max_memory', 4
```

## マルチ AZ 配置に関する考慮事項
<a name="SQLServer.ExtendedEvents.MAZ"></a>

プライマリ DB インスタンスで拡張イベントセッションを作成すると、そのセッションはスタンバイレプリカに伝達されません。新しいプライマリ DB インスタンスで、拡張イベントセッションをフェイルオーバーして作成できます。または、マルチ AZ 設定を削除してから再び追加して、拡張イベントセッションをスタンバイレプリカに伝達することもできます。RDS は、スタンバイレプリカ上のデフォルト以外の拡張イベントセッションをすべて停止し、これらのセッションがスタンバイ上のリソースを消費しません。このため、スタンバイレプリカがプライマリ DB インスタンスになった後、新しいプライマリで拡張イベントセッションを手動で開始するようにしてください。

**注記**  
このアプローチは、Always On 可用性グループとデータベースミラーリングの両方に適用されます。

SQL Server エージェントジョブを使用して、スタンバイレプリカを追跡し、スタンバイがプライマリになる場合はセッションを開始することもできます。例えば、SQL Server エージェントのジョブステップで次のクエリを使用して、プライマリ DB インスタンスでイベントセッションを再開します。

```
BEGIN
    IF (DATABASEPROPERTYEX('rdsadmin','Updateability')='READ_WRITE'
    AND DATABASEPROPERTYEX('rdsadmin','status')='ONLINE'
    AND (DATABASEPROPERTYEX('rdsadmin','Collation') IS NOT NULL OR DATABASEPROPERTYEX('rdsadmin','IsAutoClose')=1)
    )
    BEGIN
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe1')
            ALTER EVENT SESSION xe1 ON SERVER STATE=START
        IF NOT EXISTS (SELECT 1 FROM sys.dm_xe_sessions WHERE name='xe2')
            ALTER EVENT SESSION xe2 ON SERVER STATE=START
    END
END
```

このクエリにより、イベントセッション `xe1` と `xe2` が停止状態の場合は、これらのイベントセッションがプライマリ DB インスタンスで再開されます。また、このクエリに便利な間隔のスケジュールを追加することもできます。

## 拡張イベントファイルのクエリ
<a name="SQLServer.ExtendedEvents.Querying"></a>

SQL Server Management Studio または `sys.fn_xe_file_target_read_file` 関数を使用して、ファイルターゲットを使用する拡張イベントのデータを表示できます。この関数の詳細については、Microsoft ドキュメントの [sys.fn\$1xe\$1file\$1target\$1read\$1file (Transact-SQL)](https://docs.microsoft.com/en-us/sql/relational-databases/system-functions/sys-fn-xe-file-target-read-file-transact-sql) を参照してください。

拡張イベントファイルターゲットは、RDS for SQL Server の `D:\rdsdbdata\log` ディレクトリにのみファイルを書き込むことができます。

例えば、次の SQL クエリを使用して、名前が `xe` で始まる拡張イベントセッションのすべてのファイルの内容を一覧表示します。

```
SELECT * FROM sys.fn_xe_file_target_read_file('d:\rdsdbdata\log\xe*', null,null,null);
```