

# 通过 Amazon RDS for Microsoft SQL Server 使用扩展事件。
<a name="SQLServer.ExtendedEvents"></a>

您可以使用 Microsoft SQL Server 中的扩展事件来捕获 Amazon RDS for SQL Server 的调试和故障排除信息。扩展事件取代了已被微软弃用的 SQL Trace 和 Server Profiler。扩展事件类似于 Profiler 跟踪，但对跟踪的事件进行更精细的控制。Amazon RDS 上的 SQL Server 版本 2016 及更高版本支持扩展事件。有关更多信息，请参阅微软文档中的[扩展事件概述](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)
+ [多可用区部署的注意事项](#SQLServer.ExtendedEvents.MAZ)
+ [查询扩展事件文件](#SQLServer.ExtendedEvents.Querying)

## 限制和建议
<a name="SQLServer.ExtendedEvents.Limits"></a>

在 RDS for SQL Server 上使用扩展事件时，适用以下限制：
+ 仅企业版和标准版支持扩展事件。
+ 您无法更改默认的扩展事件会话。
+ 确保将会话内存分区模式设置为`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设置。 | 4MB | 4MB | 8 MB | 
| xe\$1session\$1max\$1event\$1size | 指定允许用于大型事件的最大内存大小。此值对应于事件会话的max\$1event\$1size设置。 | 4MB | 4MB | 8 MB | 
| xe\$1session\$1max\$1dispatch\$1latency | 指定事件在被发送到扩展事件会话目标之前在内存中缓冲的时间。此值对应于事件会话的max\$1dispatch\$1latency设置。 | 30 秒 | 1 秒 | 30 秒 | 
| xe\$1file\$1target\$1size | 指定文件目标的最大大小。此值对应于文件目标的max\$1file\$1size设置。 | 100MB | 10 MB | 1GB | 
| xe\$1file\$1retention | 指定事件会话的文件目标生成的文件的保留天数。 | 7 天 | 0 天 | 7 天 | 

**注意**  
通过将`xe_file_retention`设置为零，.xel 文件将在 SQL Server 解锁后自动删除。当 .xel 文件达到 `xe_file_target_size` 中设置的大小限制时，就会解锁。

您可以使用`rdsadmin.dbo.rds_show_configuration`存储过程显示这些参数的当前值。例如，使用以下 SQL 语句查看`xe_session_max_memory`的当前设置。

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

您可以使用`rdsadmin.dbo.rds_set_configuration`存储过程对其进行修改。例如，使用以下 SQL 语句将`xe_session_max_memory`设置为 4 MB。

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

## 多可用区部署的注意事项
<a name="SQLServer.ExtendedEvents.MAZ"></a>

在主数据库实例上创建扩展事件会话时，它不会传播到备用副本。您可以在新的主数据库实例上进行故障转移并创建扩展事件会话。您也可以先删除，然后再重新添加多可用区配置，以将扩展事件会话传播到备用副本。RDS 停止备用副本上的所有非默认扩展事件会话，以使这些会话不会消耗备用副本上的资源。因此，在备用副本成为主数据库实例后，确保在新的主数据库实例上手动启动扩展事件会话。

**注意**  
此方法同时适用于 Always On 可用性组和数据库镜像。

您还可以使用 SQL Server Agent 作业跟踪备用副本，并在备用副本成为主数据库实例时启动会话。例如，在 SQL Server Agent 作业步骤中使用以下查询重新启动主数据库实例上的事件会话。

```
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`。您还可以为此查询添加一个时间间隔比较方便的计划。

## 查询扩展事件文件
<a name="SQLServer.ExtendedEvents.Querying"></a>

您可以使用 SQL Server Management Studio 或`sys.fn_xe_file_target_read_file`函数来查看使用文件目标的扩展事件中的数据。有关此函数的更多信息，请参阅微软文档中的[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);
```