共用方式為


Azure SQL 中的擴充事件

適用於:Azure SQL 資料庫 Azure SQL 受控執行個體Fabric 中的 SQL 資料庫

如需擴充事件的簡介,請參閱:

Azure SQL Database 中的擴充事件、Fabric 中的 SQL 資料庫,以及 Azure SQL 受控實例的功能集、功能和使用案例,類似於 SQL Server 中可用的功能集、功能和使用案例。 主要差別在於:

  • 在 Azure SQL 資料庫、Fabric 中的 SQL 資料庫和 Azure SQL 受控執行個體中, event_file 目標一律會使用 Azure 儲存體中的 Blob,而不是磁碟上的檔案。
    • 在 SQL Server 中, event_file 目標可以使用磁碟上的檔案或 Azure 儲存體中的 Blob。
  • 在 Fabric 中的 Azure SQL Database 和 SQL 資料庫中,事件會話一律會以資料庫範圍表示。 這表示:
    • 一個資料庫中的事件工作階段無法從另外一個資料庫中收集事件。
    • 事件必須發生在要包含在工作階段中之使用者資料庫的內容中。
  • 在 Azure SQL 受控執行個體中,您可以建立伺服器範圍和資料庫範圍的事件工作階段。 建議針對大部分案例使用伺服器範圍的事件工作階段。

開始

有兩個逐步解說範例可協助您快速開始使用擴充事件:

擴充事件可用來監視唯讀複本。 如需詳細資訊,請參閱讀取複本查詢

最佳做法

採用下列最佳實務,以安全、可靠的方式使用擴充事件,而不會影響資料庫引擎運作狀態和工作負載效能。

  • 如果使用 event_file 目標:
    • 視新增至階段作業的事件而定,目標所 event_file 產生的檔案可能包含機密資料。 請仔細檢閱儲存體帳戶和容器上的 RBAC 角色指派和存取控制清單 (ACL),包括繼承的存取權,以避免授與不必要的讀取存取權。 遵循 最小權限原則
    • 在與建立事件工作階段的資料庫或受控執行個體相同的 Azure 區域中使用儲存體帳戶。
    • 讓儲存體帳戶的備援與資料庫、彈性集區受控執行個體的備援保持一致。 針對本地備援資源,請使用 LRS、GRS 或 RA-GRS。 針對區域備援資源,請使用 ZRS、GZRS 或 RA-GZRS。 如需詳細資料,請參閱 Azure 儲存體備援
    • 請勿使用 以外的任何 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 資料庫、Fabric 中的 SQL 資料庫、Azure SQL 受控執行個體和 SQL Server 中支援的擴充事件目標的詳細資訊,請參閱 擴充事件的目標

Transact-SQL 差異

當您在 SQL Server 和 Azure SQL 受控執行個體中執行 CREATE EVENT SESSIONALTER EVENT SESSIONDROP EVENT SESSION 陳述式時,可以使用 ON SERVER 子句。 在 Azure SQL 資料庫 中,改用 ON DATABASE 子句,因為在 Azure SQL 資料庫中,事件工作階段會限制資料庫範圍。

擴充事件目錄檢視

擴充事件提供數個目錄檢視。 目錄檢視會提供有關事件工作階段中繼資料定義的資訊。 這些檢視不會傳回作用中事件工作階段的執行個體的相關資訊。

如需每個平台的目錄檢視清單,請參閱擴充事件目錄檢視。

擴充事件動態管理檢視

擴充事件提供數個動態管理檢視 (DMV)。 DMV 會傳回已啟動事件工作階段的相關資訊。

如需每個平臺的 DMV 清單,請參閱 擴充事件動態管理檢視

常見的 DMV

有通用於 Azure SQL 資料庫、Azure SQL 受控執行個體和 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

請參閱 權限 ,以取得依平台的詳細權限。

儲存體容器授權與控制

當您使用目標 event_file 搭配 Azure 儲存體 Blob 時,資料庫引擎在執行事件會話時必須具有對 Blob 容器的特定存取權。 您可以透過下列其中一種方式來授與此存取權:

  • 記憶體 Blob 數據參與者 RBAC 角色指派給容器上的 Azure SQL 邏輯伺服器或 Azure SQL 受控實例的受控識別,並建立認證來指示 資料庫引擎 使用受控識別進行驗證。

    作為指派 記憶體 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 受控執行個體和 SQL Server 中,使用伺服器範圍的認證。

    您為 Azure 儲存體容器建立的 SAS 權杖必須符合下列要求:

    • rwdl 具有 (Read、 、 、 WriteDeleteList) 權限。
    • 具有包含事件工作階段存留期的開始時間和到期時間。
    • 沒有 IP 位址限制。

資源控管

在 Azure SQL 資料庫中,擴充事件工作階段的記憶體耗用量會由資料庫引擎動態控制,以將資源爭用降至最低。

事件工作階段可用的記憶體有限制:

  • 在單一資料庫中,工作階段記憶體總計限製為 128 MB。
  • 在彈性集區中,個別資料庫受限於單一資料庫的限制,且總計不能超過 512 MB。

如果收到參考記憶體限制的錯誤訊息,可以採取的矯正措施如下:

  • 執行較少的並行事件工作階段。
  • 針對事件工作階段使用 CREATEALTER 陳述式,減少您在工作階段 MAX_MEMORY 子句中指定的記憶體容量。

Note

在擴充事件中,MAX_MEMORY 子句會出現在兩種情況中:在建立或改變工作階段時 (在工作階段層級),以及使用 ring_buffer 目標時 (在目標層級)。 上述限制適用於工作階段層級記憶體。

Azure SQL 資料庫中已啟動的事件工作階段有數目限制:

  • 在單一資料庫中,限制為 100。
  • 在彈性集區中,每個集區的限制為 100 個資料庫範圍工作階段。

密集彈性集區中,即使已啟動的工作階段總數低於 100 個,啟動新的擴充事件工作階段仍可能會因為記憶體限制而失敗。

若要尋找事件工作階段所耗用的記憶體總量,請在連線到啟動事件工作階段的資料庫時執行下列查詢:

SELECT name AS session_name,
       total_buffer_size + total_target_memory AS total_session_memory
FROM sys.dm_xe_database_sessions;

若要尋找彈性集區的事件工作階段記憶體總量,需要在集區的每個資料庫中執行此查詢。