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

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

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

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

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

開始使用

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

  • 在 Azure 儲存體 中建立具有event_file目標的會話。 此範例示範如何使用目標,在 Azure 儲存體 event_file 中擷取檔案 (blob) 中的事件數據。 如果您需要保存擷取的事件數據,或者如果您想要在 SQL Server Management Studio (SSMS) 中使用事件查看器來分析擷取的數據,請使用此選項。
  • 在記憶體中建立具有ring_buffer目標的會話。 此範例示範如何使用目標,從記憶體 ring_buffer 中的事件會話擷取最新的事件。 使用此方法作為快速的方式,在臨機操作調查或疑難解答期間查看最近的事件,而不需要儲存擷取的事件數據。

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

最佳作法

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

  • 如果您使用 event_file 目標:
    • 請勿將 EVENT_RETENTION_MODE 選項設定為 NO_EVENT_LOSS。 這可能會導致連線逾時,以及影響資料庫或受控實例可用性的其他問題故障轉移延遲。
    • 在與建立事件會話的資料庫或受控實例相同的 Azure 區域中使用記憶體帳戶。
    • 讓記憶體帳戶的備援與資料庫、彈性集區或受控實例的備援保持一致。 針對 本地備援 資源,請使用 LRS、GRS 或 RA-GRS。 針對 區域備援 資源,請使用 ZRS、GZRS 或 RA-GZRS。 如需詳細資訊,請參閱 Azure 儲存體 備援
    • 請勿使用 以外的Hot任何 Blob 存取層
  • 如果您想要建立在 資料庫引擎 每次重新啟動後自動啟動的連續執行事件會話(例如,在故障轉移或維護事件之後),請在 或 ALTER EVENT SESSION 語句中包含 CREATE 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 應用程式。

注意

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

Transact-SQL 差異

當您在 SQL Server 和 Azure SQL 受控執行個體 中執行 CREATE EVENT SESSIONALTER EVENT SESSION 和 DROP 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;

權限

在 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 SESSION 和 DROP EVENT SESSION

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

儲存體 容器授權和控制

當您使用event_file目標時,事件數據會儲存在 Azure 儲存體 容器中的 Blob 中。 執行事件會話 資料庫引擎 必須具有此容器的特定存取權。 您可以建立容器的 SAS 令牌,並將令牌儲存在認證,以授與此存取權。

在 Azure SQL 資料庫 中,您必須使用資料庫範圍認證。 在 Azure SQL 受控執行個體 中,使用伺服器範圍的認證。

您為 Azure 儲存體 容器建立的 SAS 令牌必須符合下列需求:

  • rwl 具有 (ReadWriteList、 ) 許可權。
  • 具有包含事件會話存留期的開始時間和到期時間。
  • 沒有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;

若要尋找彈性集區的事件會話記憶體總計,此查詢必須在集區中的每個資料庫中執行。