

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 搭配 Amazon RDS for Microsoft SQL Server 使用擴充事件
<a name="SQLServer.ExtendedEvents"></a>

您可以在 Microsoft SQL Server 中使用擴充事件來擷取 Amazon RDS for SQL Server 的偵錯和疑難排解資訊。擴充事件會取代 SQL Trace 和 Server Profiler，其已被 Microsoft 取代。擴充事件類似於分析工具追蹤，但對所追蹤的事件具有更細微的控制。Amazon RDS 上的 SQL Server 2016 和更新版本支援擴充事件。如需詳細資訊，請參閱 Microsoft 文件中的[擴充事件概觀](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 上使用擴充事件時，會套用下列限制：
+ 擴充事件僅支援 Enterprise 和 Standard 版本。
+ 您無法變更預設的擴充事件工作階段。
+ 請務必將工作階段記憶體分區模式設定為 `NONE`。
+ 工作階段事件保留模式可以是 `ALLOW_SINGLE_EVENT_LOSS` 或 `ALLOW_MULTIPLE_EVENT_LOSS`。
+ 不支援 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` 存放的程序來顯示這些參數的目前值。例如，使用下列 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 代理程式任務來追蹤待命複本，並在待命成為主要資料庫執行個體時啟動工作階段。例如，在 SQL Server 代理程式任務步驟中使用下列查詢，以重新啟動主要資料庫執行個體上的事件工作階段。

```
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` 函數來檢視使用檔案目標之擴充事件的資料。如需有關此函數的詳細資訊，請參閱 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);
```