zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    开启mysql的远程访问权限
    react生命周期
    代码分析工具-SonarQube的安装及使用
    数据源连接神器-DBeaver
    内网搭建pip镜像源
    MySQL5.6源码包安装
    Oracle11g 离线静默安装并附安装脚本
    如何上手DataX
    RockeMQ集群部署
    Redis集群搭建
  • 原文地址:https://www.cnblogs.com/ljhdo/p/5657906.html
Copyright © 2011-2022 走看看