你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于:Microsoft Azure SQL 数据库
Microsoft Azure SQL 托管实例
Microsoft Fabric SQL 数据库
有关扩展事件的简介,请参阅:
Azure SQL 数据库中扩展事件的功能集、功能和使用方案、Fabric 中的 SQL 数据库和 Azure SQL 托管实例的功能集、功能和使用方案类似于 SQL Server 中提供的功能。 主要差异在于:
- 在 Azure SQL 数据库中、Fabric 中的 SQL 数据库和 Azure SQL 托管实例中,
event_file目标始终使用 Azure 存储中的 Blob,而不是磁盘上的文件。- 在 SQL Server 中,
event_file目标可以使用 Azure 存储中的磁盘或 Blob 上的文件。
- 在 SQL Server 中,
- 在 Azure SQL 数据库 和 Fabric 中的 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以外的任何Blob 访问层。 - 不要为存储帐户启用 分层命名空间 。
- 根据添加到会话的事件,目标生成的
- 如果要创建在数据库引擎每次重启后会自动启动的持续运行的事件会话(例如故障转移或维护事件之后),请在
STARTUP_STATE = ON或CREATE EVENT SESSION语句中包含事件会话选项ALTER EVENT SESSION。 - 反之,用
STARTUP_STATE = OFF创建短期事件会话,例如临时故障排除中使用的会话。 - 在 Azure SQL 数据库中,不要从内置
dl事件会话读取死锁事件。 如果收集了大量死锁事件,则使用 sys.fn_xe_file_target_read_file() 函数读取它们可能会导致master数据库中出现内存不足错误。 这可能会影响登录处理并导致应用程序中断。 有关监控死锁的建议方式,请参阅 使用扩展事件收集 Azure SQL 数据库中的死锁图。
事件会话目标
有关 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 列表,请参阅 扩展事件动态管理视图。
常见车管局
有通用于 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 托管实例的托管标识,并创建凭证以指示数据库引擎使用托管标识进行身份验证。
作为分配 存储 Blob 数据参与者 RBAC 角色的替代方案,您可以分配以下 RBAC 操作权限:
Namespace Action Microsoft.Storage/storageAccounts/blobServices/containers/readMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/deleteMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/readMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/write-
在 Azure SQL 数据库中,必须使用数据库范围凭据。 在 Azure SQL 托管实例和 SQL Server 中,请使用服务器范围的凭据。
为 Azure 存储容器创建的 SAS 令牌必须满足以下要求:
- 具有
rwdl(Read、Write、Delete、List) 权限。 - 具有涵盖事件会话整个生命周期的开始时间和过期时间。
- 无 IP 地址限制。
- 具有
网络安全边界(预览版)
网络安全边界(预览版)为Azure SQL 数据库及其他Azure平台即服务(PaaS)资源设置网络访问边界。 当你将逻辑服务器与网络安全边界(NSP)关联时,扩展事件向 Azure 存储建立的出站连接将受该边界访问规则的限制。
Note
Network security perimeter 仅适用于 Azure SQL 数据库。 本节不适用于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时,函数初始化时数据库引擎会检查出站访问。 当你在事件查看器中打开捕获的事件数据时,SSMS 会调用
sys.fn_MSxe_read_event_stream。
用于通过T-SQL管理事件会话的入站TDS连接不需要针对扩展事件的特定NSP配置。
CREATE EVENT SESSION这些 、 ALTER EVENT SESSION、 和 DROP EVENT SESSION 语句以及读取函数都运行在普通客户端连接上,因此它们遵循与其他客户端数据库连接相同的入站访问规则。
支持的配置
行为取决于边界的 访问模式 、存储账户是否与逻辑服务器处于同一边界内,以及两个不同的边界是否相互关联。
| SQL 逻辑服务器 NSP | 存储帐户 NSP | Behavior |
|---|---|---|
| 没有国家安全计划 | 没有国家安全计划 | 该边界不会评估连接。 扩展事件通过你配置的凭证和存储账户防火墙规则连接到存储账户。 更多信息请参见 存储容器授权与控制。 |
| 没有国家安全计划 | 在NSP中 | 边界不会对来自逻辑服务器的出站访问进行评估。 连接是否成功取决于存储帐户自身网络安全边界的入站规则。 |
| 在强制执行的NSP中 | 同一NSP | 访问始终被允许。 你不需要出站规则。 |
| 在强制执行的NSP中 | 不同但相互关联的NSP | 可通过跨边界规则进行访问。 你不需要一条出站 FQDN 规则。 |
| 在 NSP(强制模式)中 | 不同的未链接 NSP,或无 NSP | 当你使用托管身份,或者边界配置文件中的出站FQDN规则与存储账户的主机名匹配时,访问才被允许。 如果你使用SAS令牌且没有规则匹配,事件会话会以错误25602启动失败,读取函数也可能错误为25759。 |
| 在NSP(过渡期)中 | Any | 周界会评估和记录规则,但不会阻断交通。 |
配置对存储帐户的出站访问权限
当你配置数据库使用扩展事件时,可以在 托管身份 和 SAS令牌 认证之间选择。 你选择的认证机制决定了是否需要出站访问规则。
- 核实周界关联关系。 在 Azure 门户中,搜索网络安全边界,选择你的边界,然后从设置菜单中选择关联资源,确认你的服务器是否被列出。 更多信息请参见 网络安全边界。
- 选择你的身份验证机制。 使用托管身份认证。 托管身份令牌包含边界所需的声明,因此无需添加出站规则,可以跳过下一步。
- 添加出站访问规则(仅限 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;
要查找弹性池的事件会话内存总量,则需要在池中的每个数据库中执行此查询。