共用方式為


Azure SQL 資料庫和 Azure SQL 受控執行個體中的擴充事件

適用於:Azure SQL Database Azure SQL 受控執行個體

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

Azure SQL 資料庫和 Azure SQL 受控執行個體中擴充事件的功能集、功能和使用案例與 SQL Server 中的類似。 主要差別在於:

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

開始使用

有兩個範例可協助您快速開始使用 Azure SQL 資料庫和 Azure SQL 受控執行個體中的擴充事件:

  • 在 Azure 儲存體中建立具有 event_file 目標的工作階段。 此範例示範如何使用 event_file 目標,在 Azure 儲存體中擷取檔案 (blob) 中的事件資料。 如果您需要保存擷取的事件資料,或者如果您想要在 SQL Server Management Studio (SSMS) 中使用事件檢視器來分析擷取的資料,請使用它。
  • 在記憶體中,建立含 ring_buffer 目標的工作階段。 此範例示範如何使用 ring_buffer 目標,從記憶體的事件工作階段中擷取最新的事件。 使用此方法作為快速的方式,在特定調查或疑難排解期間查看最近的事件,而無需儲存擷取的事件資料。

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

最佳作法

採用下列最佳做法,在 Azure SQL 資料庫和 Azure SQL 受控執行個體中可靠地使用擴充事件,且不會影響資料庫引擎的健康情況和工作負載效能。

  • 如果使用 event_file 目標:
    • 在與建立事件工作階段的資料庫或受控執行個體相同的 Azure 區域中使用儲存體帳戶。
    • 讓儲存體帳戶的備援與資料庫、彈性集區受控執行個體的備援保持一致。 針對本地備援資源,請使用 LRS、GRS 或 RA-GRS。 針對區域備援資源,請使用 ZRS、GZRS 或 RA-GZRS。 如需詳細資料,請參閱 Azure 儲存體備援
    • 請勿使用 Hot 以外的任何 Blob 存取層
  • 如果想要建立在資料庫引擎每次重新啟動後自動啟動的持續執行事件工作階段 (例如,在容錯移轉或維護事件之後),請在 CREATE EVENT SESSIONALTER EVENT SESSION 陳述式中包含 STARTUP_STATE = ON 的事件工作階段選項。
  • 相反,請將 STARTUP_STATE = OFF 用於短期事件工作階段,例如在特定疑難排解中使用的工作階段。
  • 在 Azure SQL 資料庫中,請勿從內建 dl 事件工作階段中讀取鎖死事件。 如果收集了大量鎖死事件,使用 sys.fn_xe_file_target_read_file() 函數讀取它們可能會導致 master 資料庫中的記憶體不足錯誤。 這可能會影響登入處理,並導致應用程式中斷。 如需有關監視鎖死的建議方法,請參閱使用擴充事件收集 Azure SQL 資料庫中的鎖死圖表

事件工作階段目標

Azure SQL 資料庫和 Azure SQL 受控執行個體支援下列目標:

  • event_file 目標。 將完整緩衝區寫入 Azure 儲存體容器中的 blob。
  • ring_buffer 目標。 保留記憶體中的事件資料,直到被新的事件資料取代為止。
  • event_counter 目標。 計算在擴充事件工作階段期間發生的所有事件數目。
  • 色階分佈圖目標。 計算不同貯體中欄位或動作的不同值出現次數。
  • event_stream。 將事件數據串流至 .NET 應用程式。

注意

Azure SQL 資料庫和 Azure SQL 受控執行個體中的 event_stream 目標處於預覽狀態。

Transact-SQL 差異

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

擴充事件目錄檢視

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

目錄檢視的名稱 描述
sys.database_event_session_actions 針對事件工作階段之每個事件的每個動作傳回資料列。
sys.database_event_session_events 針對事件工作階段中的每個事件傳回資料列。
sys.database_event_session_fields 針對已在事件和目標上明確設定的每個可自訂資料行傳回資料列。
sys.database_event_session_targets 傳回事件工作階段中每一個事件目標的資料列。
sys.database_event_sessions 針對資料庫中的每個事件工作階段傳回資料列。

擴充事件動態管理檢視

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

DMV 的名稱 Description
sys.dm_xe_database_session_event_actions 傳回有關事件工作階段動作的資訊。
sys.dm_xe_database_session_events 傳回有關工作階段事件的資訊。
sys.dm_xe_database_session_object_columns 顯示繫結至工作階段之物件的組態值。
sys.dm_xe_database_session_targets 會傳回工作階段目標的相關資訊。
sys.dm_xe_database_sessions 針對在當前資料庫中執行的每個事件工作階段傳回資料列。

一般 DMV

有通用於 Azure SQL 資料庫、Azure SQL 受控執行個體和 SQL Server 的其他擴充事件 DMV:

可用的事件、動作和目標

就像在 SQL Server 中一樣,您可以使用此查詢來取得可用的事件、動作和目標:

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;

權限

提示

在 2022 年,Microsoft為擴充事件引進了一些更細微的新許可權,如需詳細資訊,請參閱 部落格:SQL Server 2022 和 Azure SQL 的新細微許可權,以改善對 PoLP 的遵循。

在 Azure SQL 資料庫和 Azure SQL 受控執行個體中,擴充事件支援細微權限模型。 可授與下列權限:

CREATE ANY DATABASE EVENT SESSION
DROP ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION
ALTER ANY DATABASE EVENT SESSION ADD EVENT
ALTER ANY DATABASE EVENT SESSION DROP EVENT
ALTER ANY DATABASE EVENT SESSION ADD TARGET
ALTER ANY DATABASE EVENT SESSION DROP TARGET
ALTER ANY DATABASE EVENT SESSION ENABLE
ALTER ANY DATABASE EVENT SESSION DISABLE
ALTER ANY DATABASE EVENT SESSION OPTION

如需每個權限控制措施的相關資訊,請參閱 CREATE EVENT SESSIONALTER EVENT SESSIONDROP EVENT SESSION

所有這些權限都包含在資料庫或受控執行個體的 CONTROL 權限中。 在 Azure SQL 資料庫中,資料庫擁有者 (dbo)、db_owner 資料庫角色的成員以及邏輯伺服器的系統管理員會保留資料庫 CONTROL 權限。 在 Azure SQL 受控執行個體中,sysadmin 伺服器角色的成員會保留執行個體 CONTROL 權限。

儲存體容器授權與控制

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

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

    作為指派 記憶體 Blob 數據參與者 RBAC 角色的替代方案,您可以指派下列 RBAC 動作:

    Namespace 動作
    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 受控執行個體中,使用伺服器範圍認證。

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

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

資源管理

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

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

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

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

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

注意

在擴充事件中,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;

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