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。
  • 在 Azure SQL Database 和 Fabric 中的 SQL 資料庫中,事件工作階段一律以資料庫為範圍。 這表示:
    • 一個資料庫中的事件工作階段無法從另外一個資料庫中收集事件。
    • 事件必須發生在要包含在工作階段中之使用者資料庫的內容中。
  • 在 Azure SQL 受控執行個體中,您可以建立伺服器範圍和資料庫範圍的事件工作階段。 建議在大多數情況下使用伺服器範圍的事件工作階段。

開始

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

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

最佳做法

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

  • 如果使用 event_file 目標:
    • 視新增至工作階段的事件而定,event_file 目標產生的檔案可能包含敏感資料。 請仔細檢閱儲存體帳戶和容器上的 RBAC 角色指派和存取控制清單 (ACL),包括繼承的存取權,以避免授與不必要的讀取存取權。 遵循 最小權限原則。
    • 在與建立事件工作階段的資料庫或受控執行個體相同的 Azure 區域中使用儲存體帳戶。
    • 使儲存體帳戶的備援與資料庫、彈性集區或受控執行個體的備援一致。 針對本地備援資源,請使用 LRS、GRS 或 RA-GRS。 針對區域備援資源,請使用 ZRS、GZRS 或 RA-GZRS。 如需詳細資料,請參閱 Azure 儲存體備援。
    • 請勿使用 Hot 以外的任何 Blob 存取層。
    • 請勿啟用記憶體帳戶的 階層式命名空間 。
  • 如果想要建立在資料庫引擎每次重新啟動後自動啟動的持續執行事件工作階段 (例如,在容錯移轉或維護事件之後),請在 STARTUP_STATE = ON 或 CREATE EVENT SESSION 陳述式中包含 ALTER EVENT SESSION 的事件工作階段選項。
  • 反之,請將 STARTUP_STATE = OFF 用於短期事件工作階段,例如用於臨時疑難排解的工作階段。
  • 在 Azure SQL Database 中,請勿從內建的 dl 事件工作階段讀取死結事件。 如果收集了大量死結事件,使用 sys.fn_xe_file_target_read_file() 函數讀取這些事件時,可能會導致 master 資料庫中發生記憶體耗盡錯誤。 這可能會影響登入處理程序,並導致應用程式中斷。 如需瞭解監視死結的建議方法,請參閱 在 Azure SQL Database 中使用延伸事件收集死結圖形。

事件工作階段目標

如需 Azure SQL 資料庫、Fabric 中的 SQL 資料庫、Azure SQL 受控執行個體和 SQL Server 中支援的擴充事件目標的詳細資訊,請參閱 擴充事件的目標。

Transact-SQL 差異

當您在 SQL Server 和 Azure SQL 受控執行個體中執行 CREATE EVENT SESSION、ALTER EVENT SESSION 和 DROP 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 受控實例的受控識別,並建立認證來指示 資料庫引擎 使用受控識別進行驗證。

    除了指派 Storage Blob Data Contributor 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、Write、Delete、List)權限。
    • 設定涵蓋整個事件工作階段生命週期的開始時間和到期時間。
    • 沒有 IP 位址限制。

網路安全邊界(預覽)

網路安全邊界(預覽)會為 Azure SQL Database 及其他 Azure 平台即服務(PaaS)資源設置網路存取邊界。 當你將邏輯伺服器與網路安全邊界(NSP)關聯時,Extended Events 對 Azure 儲存體 的出站連線會受到該邊界的存取規則約束。

Note

網路安全邊界僅適用於 Azure SQL Database。 本節不適用於 Fabric 中的 Azure SQL 受控執行個體 或 SQL 資料庫。 作為預覽功能,網路安全邊界受 Microsoft Azure 預覽版補充使用條款約束。

延伸事件如何使用網路存取功能

Extended Events 會在兩種情況下從 資料庫引擎 進行外站連線到 Azure 儲存體:

  • 寫入事件資料。 當你啟動以指向 Blob 的 event_file 為目標的事件工作階段時,資料庫引擎會在工作階段開始前先檢查對外存取,之後每次將事件緩衝區排清至該 Blob 時,也會再次檢查。
  • 讀取事件資料。 當你用 blob URL 呼叫 sys.fn_xe_file_target_read_file 或 sys.fn_MSxe_read_event_stream 時,資料庫引擎 會在函式初始化時檢查出站存取。 當你在事件檢視器中開啟擷取的事件資料時,會呼叫 sys.fn_MSxe_read_event_stream SSMS。

用於透過 T-SQL 管理事件會話的入站 TDS 連線,不需要針對擴展事件的特定 NSP 設定。 CREATE EVENT SESSION、ALTER EVENT SESSION 和 DROP EVENT SESSION 陳述式以及讀取函式,都是透過一般的用戶端連線執行,因此它們遵循與任何其他用戶端連線至資料庫時相同的入站存取規則。

支援的配置

行為取決於邊界的 存取模式 、儲存帳號是否與邏輯伺服器位於同一邊界內,以及兩個不同的邊界是否相互連結。

SQL 邏輯伺服器 NSP 儲存帳號 NSP 行為
沒有國家安全計畫 沒有國家安全計畫 邊界不會檢查該連線。 Extended Events 會用你設定的憑證和儲存帳號防火牆規則連接到儲存帳號。 欲了解更多資訊,請參閱 儲存容器授權與控制。
沒有國家安全計畫 在NSP中 邊界不會評估從邏輯伺服器發出的對外存取。 連線是否成功取決於儲存體帳戶本身安全邊界的輸入規則。
在NSP(強制執行)中 同一個NSP 隨時允許進入。 你不需要輸出規則。
在 NSP(強制執行)中 不同但相互關聯的 NSP 允許透過跨邊界規則進行存取。 你不需要輸出 FQDN 規則。
在 NSP(強制)中 不同的無連結NSP,或是沒有NSP 當你使用管理身份,或邊界設定檔中的出站 FQDN 規則與儲存帳號的主機名稱相符時,才允許存取。 如果你使用 SAS 標記且沒有規則匹配,事件會話以錯誤 25602 啟動失敗,讀取函式也可能因錯誤 25759 失敗。
在NSP(過渡階段)中 任意 周界會評估並記錄規則,但不會封鎖流量。

設定儲存帳號的外出存取權

當你設定資料庫使用擴展事件時,可以在 管理身份 與 SAS 令牌 認證之間選擇。 你選擇的驗證機制決定是否需要外站存取規則。

  1. 確認周邊的關聯。 在 Azure 入口網站中,搜尋「網路安全邊界」,選擇你的邊界,然後從設定選單中選擇「關聯資源」,以確認你的伺服器是否被列出。 欲了解更多資訊,請參閱網路安全邊界。
  2. 選擇你的認證機制。 使用管理身份驗證。 管理身份憑證包含邊界所需的聲明,因此你不需要新增出站規則,可以跳過下一步。
  3. 新增一個出站存取規則(僅限 SAS 令牌)。 如果你使用 SAS 令牌且邊界處於強制模式,請在邊界設定檔上新增出站存取規則。 例如,使用完全限定網域名稱(FQDN)和儲存帳號主機名稱作為數值的規則類型。myxedata.blob.core.windows.net

在這個例子中,你可以用*.blob.core.windows.net來允許所有 Azure 儲存體 帳號,但這個設定允許你不擁有的儲存帳號進行外站連線。 在可行情況下,請使用特定的主機名稱。

在確認需要哪些輸出規則之前,請讓周邊維持在過渡模式。 在轉換模式下,周邊防護會記錄規則評估結果,但不會封鎖存取,因此你可以在缺少的規則導致失敗之前先找出這些規則。 規則生效後切換到強制模式。

限制與行為差異

  • 資料庫引擎會在工作階段開始時,以及每次緩衝區排清時,檢查對外存取。 如果您在工作階段進行中移除輸出規則,該工作階段不會停止。 反而是個別緩衝區寫入開始失敗。
  • 管理身份和 SAS 代幣在邊界下並不等同。 管理身份憑證會攜帶邊界聲明,因此不需要外發規則。 SAS 權杖不包含這些宣告,因此在強制模式中需要有相符的輸出規則。
  • 被阻擋的讀取函式可能不會產生錯誤。 當邊界阻塞 sys.fn_xe_file_target_read_file 或 sys.fn_MSxe_read_event_stream時,函式可能會產生錯誤 25759 或 25717,或回傳一個空的結果集且無錯誤。 如果你預期會有資料,但卻沒有任何資料列,也沒有發生錯誤,請檢查你的出站規則。

當邊界阻擋存取時的錯誤

錯誤 25602 表示 event_file 目標無法初始化,因為周邊封鎖了對儲存體帳戶的輸出連線:

The target, "<target_name>", encountered a configuration error during initialization. Object cannot be added to the event session.
For more information, see https://go.microsoft.com/fwlink/?linkid=2336061.

錯誤 25759 表示周邊阻擋了讀取功能:

Network Security Perimeter (NSP) blocked outbound access to the storage URL '<url>'.
The NSP configuration does not allow reading from the specified location.

錯誤 25717 表示讀取函式正在讀取時,存取權已被撤銷。 由於 資料庫引擎 是將 blob 資料分段讀取,而非下載整個檔案,因此此錯誤可能發生在結果集的中途:

The operating system returned error <error details> while reading from the file '<url>'.

要解決上述錯誤,請切換到受管身份驗證,新增與儲存帳號主機名稱相符的出站 FQDN 規則,或將儲存帳號移至與邏輯伺服器相同的邊界。

如需更多關於目標初始化與緩衝區寫入失敗的診斷細節,請查詢擴展事件引擎日誌:

SELECT CONVERT(xml, record) AS record_xml
FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_XE_LOG';

邊界關聯變更與存取模式變更會顯示在邏輯伺服器的 Azure 活動日誌中。 進站與出站規則評估會顯示在 網路安全邊界診斷日誌中。

資源控管

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

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

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

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

  • 減少同時執行的事件工作階段數量。
  • 針對事件工作階段使用 CREATE 和 ALTER 陳述式,減少您在工作階段 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;

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