다음을 통해 공유

Azure SQL 中的扩展事件

适用于:Azure SQL 数据库Azure SQL 托管实例

有关扩展事件的简介,请参阅:

Azure SQL 数据库和 Azure SQL 托管实例中扩展事件的特征集、功能和使用方案与 SQL Server 中提供的特征集、功能和使用方案类似。 主要差异在于:

  • 在 Azure SQL 数据库和 Azure SQL 托管实例中, event_file 目标始终使用 Azure 存储中的 Blob,而不是磁盘上的文件。
    • 在 SQL Server 中, event_file 目标可以使用 Azure 存储中的磁盘或 Blob 上的文件。
  • Azure SQL 数据库仅支持数据库范围的事件会话。 这意味着:
    • 一个数据库中的事件会话无法收集另一个数据库中的事件。
    • 事件必须发生在用户数据库的上下文中才能包含在会话中。
  • 在Azure SQL 托管实例中,可以创建服务器范围和数据库范围的事件会话。 建议在大多数情况下使用服务器范围的事件会话。

开始

有两个演练示例可帮助你快速开始使用扩展事件:

  • 使用 Azure 存储中的event_file目标创建事件会话。 此示例演示如何使用 event_file 目标捕获 Azure 存储中的文件(blob)中的事件数据,并包括常见错误的 故障排除指南 。 如果需要持久化捕获的事件数据,或者想使用 SQL Server Management Studio (SSMS) 中的事件查看器来分析捕获的数据,请使用此功能。
  • 使用内存中的ring_buffer目标创建事件会话。 此示例演示如何使用 ring_buffer 目标从内存中的事件会话捕获最新事件。 使用此方法可以快速查看临时调查或故障排除期间最近发生的事件,而无需存储捕获的事件数据。

扩展事件可用于监视只读副本。 有关详细信息,请参阅副本上的读取查询

最佳实践

采用以下最佳做法,安全地、可靠地使用扩展事件,且不影响数据库引擎运行状况和工作负荷性能。

  • 如果使用 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 数据库、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;

权限

请参阅权限以获取各平台的详细权限信息。

存储容器授权和控制

event_file 目标与 Azure 存储 Blob 配合使用时,运行事件会话的数据库引擎必须具有对 Blob 容器的特定访问权限。 可通过以下方式之一授予此访问权:

  • 存储 Blob 数据参与者 RBAC 角色分配给容器中 Azure SQL 逻辑服务器或 Azure SQL 托管实例的托管标识,并创建凭证以指示数据库引擎使用托管标识进行身份验证。

    作为分配存储 Blob 数据参与者 RBAC 角色的替代方法,可以分配以下 RBAC 操作:

    命名空间 操作
    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 (ReadWriteDeleteList) 权限。
    • 具备包含事件会话生存期的开始时间和到期时间。
    • 无 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;

要查找弹性池的事件会话内存总量,则需要在池中的每个数据库中执行此查询。