SQL Server 扩展事件

Posted 悦光阴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Server 扩展事件相关的知识,希望对你有一定的参考价值。

SQL Server 扩展事件(Extended Event)是用于服务器的常规事件处理系统,是追踪SQL Server系统运行状态的神器,同时也是一个日志记录工具,扩展事件完全可以取代SQL追踪(SQL Trace),扩展事件的设计功能:

  • 由于扩展事件引擎不识别事件,因此,引擎可以将任何事件绑定到任何目标,因为引擎不受事件内容约束。
  • 事件与事件使用者不同,后者在扩展事件中称为“目标”(Target),也就是说任何目标可以接收任何事件。此外,引发的任何事件均可供目标自动使用,这样可以记录或提供额外的事件上下文。
  • 事件不同于在事件激发时要执行的操作。因此,任何操作可以与任何事件相关联。
  • 谓词可以动态筛选事件的激发,从而增强了扩展事件基础结构的灵活性。

扩展事件可以同步生成事件数据(并异步处理该数据),这为事件处理提供了灵活的解决方案。此外,扩展事件提供以下功能:

  • 一种跨服务器系统处理事件的统一方法,同时使用户可以隔离特定的事件进行故障排除。
  • 基于 Transact-SQL 的完全可配置的事件处理机制。
  • 可以动态监视活动进程,同时对这些进程的影响最小。

使用TSQL创建扩展事件的过程比较复杂,但是,我们可以使用另外一种简单的方法:使用扩展时间的创建向导。

一,创建扩展事件的会话

step1,打开新建会话向导(New Session Wizard)

step2,设置会话属性(Set Session Properties)

step3,选择模板(Choose Template)

step4,选项捕获的事件(Select Events to Capture)

该Tab分为两个Pane,左边Pane用于搜索Event,在Event library中,输入需要进行追踪的Event 名称,在选择一个Event之后,Wizard会显示出该Event的Description和 Event Fields,Event fields 是描述Event输出的字段。右边Pane用于列出已经选中的Events 列表。

Step5,选择捕获的字段(Capture Global Fields)

选择Event发生时其他信息,这些信息一般跟Session相关,例如Database_id 和 Database_id 就是Event发生的database 信息。一般会将sql_text也选中,便于查看触发Event的SQL语句。

Step6,设置会话时间的过滤器(Set Session Event Filters)

Step7,指定会话数据的存储(Specify Session Data Storage)

制定输出数据存储的目标(target),该tab中列出 Event File target 和 ring buffer target。

Event File target使用File来存储Session Output,当需要存储大量数据集时,使用该选项。

Ring buffer target使用Memory buffer来存储Session Output,如果分配的memory buffer用完,target会将最老的Events删除,以容纳新的Events,使memory buffers中存储的是most recent data。

Step8,查看扩展事件会话的汇总信息,开始创建事件会话。

二,查看扩展事件捕获的消息

SQL Server 扩展事件捕获的消息,叫做Target,使用Target来存储Events,Target 能够把捕获的消息存储到文件中(扩展名是 .xel),或 memoy buffer 中(Ring Buffer),Target能够以同步或异步方式处理数据,事件的数据都是以XML格式存储。

三,以文件存储Target的数据

Target对于扩展事件产生的数据,总是先缓存在内存buffer中,等到内存buffers积累足够数量的数据之后,再将内存中的所有数据写入到文件中。文件中的数据滞后于内存 buffer,这就是异步写(Async Write),能够减少IO的次数,提高IO效率。事件文件类型的taget的扩展名是xel,以XML格式存储Target 数据,使用 sys.fn_xe_file_target_read_file 函数查看事件文件中存储的数据。

1,以Rollover 方式复用事件文件

事件文件类型的Target 以 rollover 方式复用文件,例如,如果 max_rollover_files=3,那么系统中最多保留 3个 xel文件,文件命名:xxx_0.xel,xxx_1.xel,xxx_2.xel。当文件xxx_0.xel达到Max_File_Size时,Target执行一次rollover,将文件:xxx_0.xel删除,创建新文件:xxx_3.xel,并用该文件存储事件数据。

2,从 sys.dm_xe_session_targets 中查看事件文件的存储路径

select s.name as xe_session_name,
    cast(st.target_data as xml) as target_data
from sys.dm_xe_sessions s 
inner join sys.dm_xe_session_targets st 
    on s.address=st.event_session_address
where s.name=\'xe_session_name\'

3,从xel文件中检查target的输出

SELECT *, CAST(event_data AS XML) AS \'event_data_XML\'
FROM sys.fn_xe_file_target_read_file(\'file_name*.xel\', NULL, NULL, NULL)

四,Ring Buffer Target

Ring buffer target将事件数据保存到内存中,事件数据以XML格式存储。一旦事件数据把分配的内存Buffers 用尽,那么最老的事件数据将被清除。

1,存储模式

ring buffer target简单地把数据存储到内存中,这种target模式能够采用两种模式来管理事件:

  • 第一种模式是严格地先进先出(first-in first-out ,FIFO),也就是说,当分配的内存被target耗尽时,从内存中移除创建时间最早的事件。
  • 第二种模式是per-event 先进先出模式,也就是说,每一种类型的事件都持有一个计数。在这种模式下,当分配的内存被target耗尽时,每个类型中创建时间最早的事件从内存中被移除。

2,从 sys.dm_xe_session_targets 中查看target输出

SELECT name, target_name, CAST(xet.target_data AS xml)
FROM sys.dm_xe_session_targets AS xet
JOIN sys.dm_xe_sessions AS xe
   ON (xe.address = xet.event_session_address)
WHERE xe.name = \'session_name\'

五,使用SSMS查看Target数据

通过TSQL 脚本获取的Target 输出都是以XML格式显示的,通过View Target Data能够以 表格 方式查看Target的输出

六,查询会话(session)和 target

1,查看扩展事件的Session 配置

select s.name,
    s.total_regular_buffers*s.regular_buffer_size/1024 as total_regular_buffer_kb,
    s.total_buffer_size/1024 as total_buffer_kb,
    s.buffer_policy_desc,
    s.flag_desc,
    s.dropped_event_count,
    s.dropped_buffer_count
from sys.dm_xe_sessions s

字段注释:

Regular buffer:大多数时间下,扩展事件会话使用的是常规的buffer,这些buffer容量大,存储很多事件的信息。特别地,每一个扩展事件会话都会有三个或更多的buffer。常规buffer的分配是由SQL Server决定的,而SQL Server基于 MEMORY_PARTITION_MODE 选项来设置内存分区,常规buffer的size和 MAX_MEMORY选项的设置相同。

buffer_policy_desc:用于表述当buffer耗尽时,扩展事件会话是如何处理新触发的事件:

  • Drop event
  • Do not drop events
  • Drop full buffer
  • Allocate new buffer

2,查看会话target的配置

select s.name as xe_session_name,
    st.target_name,
    st.execution_count,
    st.execution_duration_ms/st.execution_count as avg_execution_ms,
    st.target_data
from sys.dm_xe_session_targets st 
inner join sys.dm_xe_sessions s 
    on st.event_session_address=s.address

当Target的名称是 event file 时,Session 输出的数据实际上是存储在Event file中。

当Target的名称是 ring buffer时,Session 输出的数据存储在内存 buffers中,通过 sys.dm_xe_session_targets的 target_data 字段查看

 

 

参考文档:

SQL Server Extended Events Targets

sys.dm_xe_sessions (Transact-SQL)

sys.dm_xe_session_targets (Transact-SQL)

sys.fn_xe_file_target_read_file (Transact-SQL)

How to Query Extended Events Target XML

Realistic troubleshooting example of extended events (XEvent) usage in SQL Server 2008 – Part 1

Using Xquery to query Extended Events asynchronous file target results

以上是关于SQL Server 扩展事件的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft SQL Server 代码片段收集

扩展事件和 SQL Server Profiler

缺少 SQL SERVER 2014 代码片段

SQL Server扩展事件-- 使用system_health默认跟踪会话监控死锁

通过SQL Server的扩展事件来跟踪SQL语句在运行时,时间都消耗到哪儿了?

通过 filebeats 或 nxlog 等日志收集器读取 XEL(SQL Server 扩展事件文件)