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 SESSION、ALTER 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 SESSION、ALTER 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
具有 (Read
、Write
List
、 ) 許可權。- 具有包含事件會話存留期的開始時間和到期時間。
- 沒有IP位址限制。
資源管理
在 Azure SQL 資料庫 中,擴充事件會話的記憶體耗用量會由 資料庫引擎 動態控制,以將資源爭用降至最低。
事件工作階段可用的記憶體有限制:
- 在單一資料庫中,會話記憶體總計限製為128 MB。
- 在彈性集區中,個別資料庫受限於單一資料庫限制,且總計不能超過 512 MB。
如果您收到參考記憶體限制的錯誤訊息,您可以採取的更正動作如下:
- 執行較少的並行事件工作階段。
- 針對事件會話使用
CREATE
和ALTER
語句,減少您在會話子句中指定的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;
若要尋找彈性集區的事件會話記憶體總計,此查詢必須在集區中的每個資料庫中執行。
相關內容
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應