zoukankan      html  css  js  c++  java
  • 【监控笔记】【2.1】扩展事件

    转自:http://blog.csdn.net/kk185800961/article/details/49725903

    强烈建议参考:https://www.cnblogs.com/ljhdo/p/5657906.html

    相关参考:

    1. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events
    2. SQL Server 扩展事件(Extented Events)从入门到进阶(2)——在GUI中创建基础扩展事件
    3. SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event
    4. SQL Server 扩展事件(Extented Events)从入门到进阶(4)——扩展事件引擎——基本概念

    SQL Server 扩展事件具有高度可伸缩且高度可配置的体系结构,使用户能够按需收集解决性能问题或确定性能问题所需的信息。扩展事件是使用非常少的性能资源的轻型性能监视系统。扩展事件可以同步生成事件数据(并异步处理该数据),这为事件处理提供了灵活的解决方案。sqlserver 2008 开始了扩展事件功能,到 sqlserver 2012 后,扩展事件进行了可视化的界面操作。

       

    官方导航相关信息:

    主题

    说明


    扩展事件可以说是sql server  profiler  的改造,将其放到系统管理中,可以用sql 脚本实现多样化监控和处理。

    对于扩展事件与 profiler 的操作比较,参考一位大侠博客:SQLSERVER2012里的扩展事件初尝试 

    扩展事件 “包”  有几个相关概念:事件,目标,操作,类型,谓词,映射 (更多参考: SQL Server 扩展事件包

       

    (概念参考官方说明,开始有些难以理解)

    【1】事件:

      事件是程序(例如 SQL Server)的执行路径中的相关监视点。事件触发即表明已经到达相关点,并具有自事件触发以来的状态信息。

    【2】目标:

      目标是指事件使用者。目标在触发事件的线程中同步处理事件或在系统提供的线程中异步处理事件。

      通常,在必须保持特定数据排序时将使用同步处理。扩展事件提供了多个目标,您可以根据需要将其用于定向事件输出。(更多穿单裤: SQL Server 扩展事件目标)

      保存会话数据:

        (1)ETW_classic_sync_target:以ETW(Event Tracing for windows)格式输出事件

        (2)Event_counter:输出事件到内存记录绘画中以跟踪事件触发的次数

        (3)Event_file:输出到磁盘上的一个目录文件中

        (4)Histogram:输出事件到内存,基于域和行动分组计数事件

        (5)Pair_matching:输出事件到内存,跟踪基于目标配置的一定量的事件数据

        (6)Ring_buffer:输出事件到内存,跟踪基于目标配置的一定量的事件数据

    【3】操作:

      操作是对事件做出的一个编程方式的响应或一系列响应。操作与事件绑定在一起,并且每个事件都可能具有唯一的一组操作。

    【4】类型:

      由于数据是排列在一起的字节集合,因此需要使用字节集合的长度和特征来解释这些数据。该信息将封装在 Type 对象中。

    下面是为包对象提供的类型:event,action,target,pred_source,pred_compare,type

    【5】谓词:

      谓词是一组逻辑规则,用于在处理事件时计算这些事件。这可以使扩展事件用户根据特定条件有选择地捕获事件数据。

    【6】映射:

      映射表用于将内部值映射到字符串,这使用户可以知道该值代表什么。用户可以获得关于内部值真正含义的说明,而不是只能够获取数值。

    相关概念:扩展事件引擎,扩展事件会话  可参考官方文档。

     配置查看:

    --包信息详情
    SELECT T1.name,T1.description,T2.name,T2.object_type,T2.description
    FROM sys.dm_xe_packages t1
    INNER JOIN sys.dm_xe_objects t2 ON T1.guid=T2.package_guid
    
    select * from sys.dm_xe_objects --查看所有类型,比如:事件/动作/目标 等等相关信息
    -- 案例 select * from sys.dm_xe_objects where object_type='event' and object_name=''   查看具体事件
    
    --查看已经存在的扩展事件信息
    SELECT * FROM sys.dm_xe_sessions --扩展事件信息(事件)
    SELECT * FROM sys.dm_xe_session_events    --扩展事件对应的跟踪参数信息(谓词)
    SELECT * FROM sys.dm_xe_session_event_actions    --跟踪事件字段,所属事件,所属包(动作)
    SELECT * FROM sys.dm_xe_session_object_columns  --绑定到会话的对象的配置值
    SELECT * FROM sys.dm_xe_session_targets            --目标信息

    总的系统视图如下:

    --    扩展事件元数据信息
    SELECT * FROM sys.dm_xe_packages
    SELECT * FROM sys.dm_xe_objects
    SELECT * FROM sys.dm_xe_map_values
    SELECT * FROM sys.dm_xe_object_columns
    SELECT * FROM sys.dm_xe_session_event_actions
    SELECT * FROM sys.dm_xe_sessions
    SELECT * FROM sys.dm_xe_session_events
    SELECT * FROM sys.dm_xe_session_targets
    SELECT * FROM sys.dm_xe_session_object_columns
    
    --    当前扩展事件信息
    SELECT * FROM sys.server_event_notifications
    SELECT * FROM sys.server_event_sessions
    SELECT * FROM sys.server_event_session_events
    SELECT * FROM sys.server_event_session_actions
    SELECT * FROM sys.server_event_session_targets
    SELECT * FROM sys.server_event_session_fields
    SELECT * FROM master.sys.fn_MSxe_read_event_stream (N'deadlock*.xel', 1)
    SELECT * FROM master.sys.fn_xe_file_target_read_file(N'deadlock*.xel', NULL, NULL, NULL)
    
    SELECT object_name as event,convert(xml, event_data) as xml_data
    FROM master.sys.fn_xe_file_target_read_file(N'D:deadlock*.xel', NULL, NULL, NULL)

    看概念很难理解,创建一个示例说明吧。功能是:查询超过 3 秒的执行语句

    --    删除事件会话
    IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name = 'es_slow_query')
    DROP EVENT SESSION [es_slow_query] ON SERVER 
    GO
    
    --    创建事件会话
    CREATE EVENT SESSION [es_slow_query] ON SERVER 
    ADD EVENT sqlserver.rpc_completed(
    ACTION(sqlos.task_time,sqlserver.database_name,sqlserver.nt_username,sqlserver.sql_text,sqlserver.transaction_id)
    WHERE ([duration]>=(3000000))),
    ADD EVENT sqlserver.sql_batch_completed(
    ACTION(sqlos.task_time,sqlserver.database_name,sqlserver.nt_username,sqlserver.sql_text,sqlserver.transaction_id)
    WHERE ([duration]>=(3000000))) 
    ADD TARGET package0.event_file(
    SET filename=N'D:Program FilesMicrosoft SQL Serverslow_query',    --存储路径及文件名前缀
    max_file_size=(10),    --最大文件大小,单位MB
    max_rollover_files=(4))    --启用文件滚动存储的最大文件数
    WITH (
    MAX_MEMORY=4096 KB,    --最大内存大小
    EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,--事件保留模式:ALLOW_SINGLE_EVENT_LOSS/ALLOW_MULTIPLE_EVENT_LOSS/NO_EVENT_LOSS
    MAX_DISPATCH_LATENCY=30 SECONDS,--最大调度滞后事件,单位秒。0秒为无限制。
    MAX_EVENT_SIZE=0 KB,    --最大事件大小
    MEMORY_PARTITION_MODE=NONE,    --内存分区模式:无(NONE)/每个节点(PER_NODE)/每个cpu(PER_CPU)
    TRACK_CAUSALITY=OFF,    --因果关系跟踪,跟踪事件彼此相关的方式
    STARTUP_STATE=ON)    --服务器启动时是否启动事件会话
    GO
    
    --    启用(停止)事件会话(START / STOP)
    ALTER EVENT SESSION [es_slow_query] ON SERVER STATE=START
    GO

    首先了解的是扩展事件元数据:

    --    针对每个加载到服务器地址空间的模块返回一行
    SELECT * FROM sys.dm_os_loaded_modules t1
    WHERE EXISTS(SELECT * FROM sys.dm_xe_packages t2 WHERE t1.base_address=t2.module_address)
    
    
    --    对事件包显示的每个对象都返回一行( 可以是 事件/操作/目标/谓词/类型)
    --    这里只查看 “操作”信息
    SELECT * FROM sys.dm_xe_objects 
    WHERE name = 'task_time' AND object_type='action'
    AND package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos'))
    UNION ALL
    SELECT * FROM sys.dm_xe_objects 
    WHERE name IN( 'database_name','nt_username','sql_text','transaction_id') AND object_type='action'
    AND package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlserver'))
    /*
    sys.dm_xe_objects 查看包内容:
    sqlos,sqlserver 和 package0 均为包名称。
    sqlserver.rpc_completed 为包中的事件;
    sqlos.task_time,sqlserver.database_name 为包中的操作
    package0.event_file    为包中的目标
    [duration] 为包中的谓词,只是包名称没写出来
    */
    
    
    --    【每个包对应的每个内容!】
    SELECT T1.name,T1.description,T2.name,T2.object_type,T2.description
    FROM sys.dm_xe_packages t1
    INNER JOIN sys.dm_xe_objects t2 ON T1.guid=T2.package_guid
    
    --    返回一个内部数字键到可读文本的映射 (当前无信息)
    SELECT * FROM sys.dm_xe_map_values
    WHERE object_package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos','sqlserver'))
    AND name IN( 'task_time' ,'database_name','nt_username','sql_text','transaction_id')
    
    SELECT * FROM sys.dm_xe_map_values T0
    INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name
    
    
    --    返回所有对象的架构信息
    SELECT * FROM sys.dm_xe_object_columns T0
    INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name
    WHERE object_package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos','sqlserver'))
    AND T0.name IN( 'task_time' ,'database_name','nt_username','sql_text','transaction_id')
    AND T1.object_type='action'
    
    SELECT * FROM sys.dm_xe_object_columns T0
    INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name


    上面查询的是元数据信息,下面将查看当前扩展事件会话信息:(就不截图了)

    -- 为每个服务器级事件通知对象返回一行
    SELECT * FROM sys.server_event_notifications
    
    --    扩展事件
    SELECT * FROM sys.dm_xe_sessions WHERE name = 'es_slow_query'
    SELECT * FROM sys.server_event_sessions WHERE name = 'es_slow_query'
    
    
    --    跟踪的事件
    SELECT * FROM sys.dm_xe_session_events
    WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')
    
    SELECT * FROM sys.server_event_session_events 
    WHERE event_session_id in(SELECT event_session_id FROM sys.server_event_sessions WHERE name = 'es_slow_query')
    
    
    --    跟踪事件字段
    SELECT * FROM sys.dm_xe_session_event_actions
    WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')
    
    SELECT * FROM sys.server_event_session_actions t1
    WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')
    
    --    绑定到会话的对象的配置值
    SELECT * FROM sys.dm_xe_session_object_columns t1
    WHERE EXISTS(SELECT * FROM sys.dm_xe_objects t2 where t1.object_package_guid=t2.package_guid and t1.object_name=t2.name )
    AND event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')
    
    
    --    目标信息
    SELECT * FROM sys.dm_xe_session_targets
    WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')
    
    SELECT * FROM sys.server_event_session_targets t1
    WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')
    
    SELECT * FROM sys.server_event_session_fields t1
    WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')
    
    
    --    读取目标文件信息
    SELECT type, data FROM sys.fn_MSxe_read_event_stream (N'D:Program FilesMicrosoft SQL Serverslow_query*.xel', 1)
    
    SELECT * FROM master.sys.fn_xe_file_target_read_file('D:Program FilesMicrosoft SQL Serverslow_query*.xel', NULL, NULL, NULL)
    -- 查询结果
    SELECT
    object_name as event,file_name,convert(xml, event_data) as xml_data FROM master.sys.fn_xe_file_target_read_file('D:Program FilesMicrosoft SQL Serverslow_query*', NULL, NULL, NULL) <event name="sql_batch_completed" package="sqlserver" timestamp="2015-11-08T16:29:52.355Z"> <data name="cpu_time"> <value>0</value> </data> <data name="duration"> <value>4023208</value> </data> <data name="physical_reads"> <value>16</value> </data> <data name="logical_reads"> <value>76</value> </data> <data name="writes"> <value>0</value> </data> <data name="row_count"> <value>2</value> </data> <data name="result"> <value>0</value> <text>OK</text> </data> <data name="batch_text"> <value>begin tran update tab set name='kk' where id =1 waitfor delay '00:00:04' update tab set name='kk' where id =2 commit tran </value> </data> <action name="transaction_id" package="sqlserver"> <value>0</value> </action> <action name="sql_text" package="sqlserver"> <value>begin tran update tab set name='kk' where id =1 waitfor delay '00:00:04' update tab set name='kk' where id =2 commit tran </value> </action> <action name="nt_username" package="sqlserver"> <value>HZCAdministrator</value> </action> <action name="database_name" package="sqlserver"> <value>Demo</value> </action> <action name="task_time" package="sqlos"> <value>54284</value> </action> </event>


    官方案例参考:

    如何确定哪些查询持有锁

    如何查找具有最多锁定的对象

    如何获取 ADD TARGET 参数的可配置参数

    如何获取所有事件的字段

    如何使用扩展事件监视系统活动

    如何查看注册包的事件

    如何查看已注册包的扩展事件目标

    更多参考:
    扩展事件

    SQLSERVER2012里的扩展事件初尝试

    本文地址:http://blog.csdn.net/kk185800961/article/details/49725903
    ---------------------
    作者:薛定谔的DBA
    来源:CSDN
    原文:https://blog.csdn.net/kk185800961/article/details/49725903
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Java深入学习31:ArrayList并发异常以及解决方案
    Java深入学习30:CAS中的ABA问题以及解决方案
    Java深入学习29:线程等待和唤醒的两个方案
    Redis学习05:Springboot集成Redis集群cluster
    项目总结66:Springboot项目继承kafka集群
    项目总结65:内存溢出OOM问题处理
    异常处理009:Windows10远程桌面连接提示:出现身份验证错误,要求的函数不受支持
    项目总结64:分别使用Redisson和Zookeeper分布式锁模拟模拟抢红包业务
    项目总结63:使用Spring AOP和BindingResult实现对接口的请求数据校验,并用@ExceptionHandler返回校验结果
    Java深入学习04:深入理解HashMap
  • 原文地址:https://www.cnblogs.com/gered/p/10967719.html
Copyright © 2011-2022 走看看