Azure SQL 数据库中的扩展事件
适用于:Azure SQL 数据库
Azure SQL 数据库中扩展事件的功能集是 SQL Server 和 Azure SQL 托管实例上强大功能的子集。
XEvents 不是正式名称,有时在博客或其他非正式场合表示“扩展的事件”。
有关扩展事件的其他信息,请访问:
先决条件
本文假设你已部分掌握以下知识:
关于扩展事件的许多文档都适用于 SQL Server、Azure SQL 数据库和 Azure SQL 托管实例。
选择事件文件作为 目标时,事先了解以下项目会很有帮助:
代码示例
相关文章提供了两个代码示例:
-
- 简短的 Transact-SQL 脚本。
- 代码示例文章中强调,用完环形缓冲区目标时,应通过执行 alter-drop
ALTER EVENT SESSION ... ON DATABASE DROP TARGET ...;
语句释放其资源。 然后可以通过ALTER EVENT SESSION ... ON DATABASE ADD TARGET ...
添加环形缓冲区的另一个实例。
-
- 阶段 1 是 PowerShell,用于创建 Azure 存储容器。
- 阶段 2 是 Transact-SQL,它使用 Azure 存储容器。
Transact-SQL 的差异
在 SQL Server 上执行 CREATE EVENT SESSION 命令时,请使用 ON SERVER 子句。 但在 Azure SQL 数据库上,应改用 ON DATABASE 子句。
ON DATABASE 子句也适用于 ALTER EVENT SESSION 和 DROP EVENT SESSION Transact-SQL 命令。
最佳做法是在 CREATE EVENT SESSION 或 ALTER EVENT SESSION 语句中包含 STARTUP_STATE = ON 的事件会话选项。
- = ON 值支持在由于故障转移而重新配置逻辑数据库之后自动重新启动。
新的目录视图
扩展事件功能受多个目录视图的支持。 目录视图显示有关当前数据库中用户创建的事件会话的元数据或定义的信息。 视图不会返回有关活动事件会话的实例的信息。
目录视图名称 | 说明 |
---|---|
sys.database_event_session_actions | 返回针对事件会话的每个事件执行的每个操作所对应的行。 |
sys.database_event_session_events | 返回事件会话中每个事件所对应的行。 |
sys.database_event_session_fields | 返回针对事件和目标上显式设置的每个可自定义列所对应的行。 |
sys.database_event_session_targets | 返回事件会话的每个事件目标所对应的行。 |
sys.database_event_sessions | 返回数据库中每个事件会话所对应的行。 |
在 Microsoft SQL Server 中,类似目录视图的名称包含 .server_ 而不是 .database_。 名称模式类似于 sys.server_event_%
。
新的动态管理视图 (DMV)
Azure SQL 数据库具有支持扩展事件的动态管理视图 (DMV)。 DMV 显示有关 活动 事件会话的信息。
DMV 的名称 | 说明 |
---|---|
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 | 返回划归到当前数据库的每个事件会话所对应的行。 |
在 Microsoft SQL Server 中,类似目录视图的名称不包含 _database 部分,例如:
sys.dm_xe_sessions
,而不是sys.dm_xe_database_sessions
。
两者通用的 DMV
对于扩展的事件,有通用于 Azure SQL 数据库、Azure SQL 托管实例和 Microsoft 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;
Azure SQL 数据库事件会话的目标
可从 Azure SQL 数据库上的事件会话捕获结果的目标如下:
Windows 事件跟踪 (ETW) API 不适用于 Azure SQL 数据库上的扩展事件。
限制
有几个安全相关的差异适用于 Azure SQL 数据库的云环境:
- 扩展事件在单租户隔离模型中构建。 一个数据库中的事件会话无法访问另一个数据库中的数据或事件。
- 无法在
master
数据库的上下文中发出CREATE EVENT SESSION
语句。
权限模型
必须拥有数据库的控制权限才能发出 CREATE EVENT SESSION
语句。 数据库所有者 (dbo) 拥有控制权限。
存储容器授权
针对 Azure 存储容器生成的 SAS 令牌必须为权限指定 rwl 。 rwl 值提供以下权限:
- 读取
- 写入
- 列出
性能注意事项
在某些情况下,大量使用扩展事件可能累积过多的活动内存,使整个系统无法正常运行。 因此,Azure SQL 数据库会动态设置和调整事件会话可以累积的活动内存量限制。 动态计算会考虑许多因素。
Azure SQL 数据库中的 XEvent 会话可用内存有一个上限:
- 在 DTU 购买模型的单个 Azure SQL 数据库中,每个数据库最多可使用 128 MB。 这仅在高级层中提高到 256 MB。
- 在 vCore 购买模型的单个 Azure SQL 数据库中,每个数据库最多可使用 128 MB。
- 在弹性池中,单个数据库受单个数据库限制,总共不能超过 512 MB。
如果收到错误消息,指出已强制实施内存最大值,可采取以下纠正措施:
- 减少运行的并发事件会话。
- 通过对事件会话执行 CREATE 和 ALTER 语句,减少在 MAX_MEMORY 子句中指定的内存量。
在 Azure SQL 数据库中,启动的 XEvent 会话的存在数量上限:
- 在单个 Azure SQL 数据库中,限制为 100。
- 在弹性池中,限制为每个池 100 个数据库范围的会话。
在密集弹性池中,即使启动的会话总数低于 100,启动新的扩展事件会话也可能因内存限制而失败。
网络延迟
事件文件目标在将数据保存到 Azure 存储 Blob 时可能会遇到网络延迟或故障。 Azure SQL 数据库中的其他事件可能会延迟,因为它们要等待网络通信完成。 这种延迟可能会导致工作负荷变慢。
- 若要缓解这种性能风险,请避免在事件会话定义中将 EVENT_RETENTION_MODE 选项设为 NO_EVENT_LOSS。