SQL Server 扩展事件(Extended Event)是用于服务器的常规事件处理系统,是追踪SQL Server系统运行状态的神器,同时也是一个日志记录工具,扩展事件完全可以取代SQL追踪(SQL Trace),扩展事件的设计功能:
- 由于扩展事件引擎不识别事件,因此,引擎可以将任何事件绑定到任何目标,因为引擎不受事件内容约束。
- 事件与事件使用者不同,后者在扩展事件中称为“目标”(Target),也就是说任何目标可以接收任何事件。此外,引发的任何事件均可供目标自动使用,这样可以记录或提供额外的事件上下文。
- 事件不同于在事件激发时要执行的操作。因此,任何操作可以与任何事件相关联。
- 谓词可以动态筛选事件的激发,从而增强了扩展事件基础结构的灵活性。
扩展事件可以同步生成事件数据(并异步处理该数据),这为事件处理提供了灵活的解决方案。此外,扩展事件提供以下功能:
- 一种跨服务器系统处理事件的统一方法,同时使用户可以隔离特定的事件进行故障排除。
- 基于 Transact-SQL 的完全可配置的事件处理机制。
- 可以动态监视活动进程,同时对这些进程的影响最小。
使用TSQL创建扩展事件的过程比较复杂,但是,我们可以使用另外一种简单的方法:使用扩展时间的创建向导。
一,创建扩展事件的会话
step1,打开新建会话向导(New Session Wizard)
![](https://i-blog.csdnimg.cn/blog_migrate/52a559b39f97c5e2578965dd6b7d3836.jpeg)
step2,设置会话属性(Set Session Properties)
![](https://i-blog.csdnimg.cn/blog_migrate/acbbc7f42ccb8e28cc70329ca3569f58.jpeg)
step3,选择模板(Choose Template)
![](https://i-blog.csdnimg.cn/blog_migrate/f00b59bdbf7afcc937ea3839aeb58105.jpeg)
step4,选项捕获的事件(Select Events to Capture)
该Tab分为两个Pane,左边Pane用于搜索Event,在Event library中,输入需要进行追踪的Event 名称,在选择一个Event之后,Wizard会显示出该Event的Description和 Event Fields,Event fields 是描述Event输出的字段。右边Pane用于列出已经选中的Events 列表。
![](https://i-blog.csdnimg.cn/blog_migrate/97aa838e7d45d18f7fa50efc8ab82297.jpeg)
Step5,选择捕获的字段(Capture Global Fields)
选择Event发生时其他信息,这些信息一般跟Session相关,例如Database_id 和 Database_id 就是Event发生的database 信息。一般会将sql_text也选中,便于查看触发Event的SQL语句。
![](https://i-blog.csdnimg.cn/blog_migrate/d1f04b5830b0770b5d99917de5971ee7.jpeg)
Step6,设置会话时间的过滤器(Set Session Event Filters)
![](https://i-blog.csdnimg.cn/blog_migrate/c11b5e8ab0295717572a2884c8d06f49.jpeg)
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。
![](https://i-blog.csdnimg.cn/blog_migrate/c28ae9bebb0f3656195f2aa496002866.jpeg)
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的输出
![](https://i-blog.csdnimg.cn/blog_migrate/778e4fd77962fb0de94fbceb42e9b30a.png)
六,查询会话(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