SQLServer 扩展事件(Extended Events)

http://blog.youkuaiyun.com/kk185800961/article/details/49725903


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



官方导航相关信息:

主题

说明

SQL Server 扩展事件简介

介绍扩展事件并说明如何能使用该功能。

SQL Server 扩展事件概念

介绍了与扩展事件有关的主要概念。

SQL Server 扩展事件包

介绍了扩展事件包,扩展事件会话运行期间这些包中的对象将用于获取和处理数据。

SQL Server 扩展事件目标

介绍了在事件会话期间可接收数据的事件使用者。

SQL Server 扩展事件引擎

介绍了可实现和管理扩展事件会话的引擎。

SQL Server 扩展事件会话

介绍了扩展事件会话。

使用 SQL Server 扩展事件

总结了用于扩展事件的 DDL 语句和视图。

SQL Server 扩展事件操作指南主题

包含如何获取事件相关信息的操作指南主题,这些信息可用于创建和更改扩展事件会话。同时提供了端到端的扩展事件会话以说明如何使用此功能监控系统活动。



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

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



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



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

事件:

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

目标:

目标是指事件使用者。目标在触发事件的线程中同步处理事件或在系统提供的线程中异步处理事件。通常,在必须保持特定数据排序时将使用同步处理。扩展事件提供了多个目标,您可以根据需要将其用于定向事件输出。(更多穿单裤: SQL Server 扩展事件目标

操作:

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

类型:

由于数据是排列在一起的字节集合,因此需要使用字节集合的长度和特征来解释这些数据。该信息将封装在 Type 对象中。
下面是为包对象提供的类型:event,action,target,pred_source,pred_compare,type

谓词:

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

映射:

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


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



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

[sql]  view plain  copy
  1. --  删除事件会话  
  2. IF EXISTS(SELECT * FROM sys.server_event_sessions WHERE name = 'es_slow_query')  
  3.     DROP EVENT SESSION [es_slow_query] ON SERVER   
  4. GO  
  5.   
  6. --  创建事件会话  
  7. CREATE EVENT SESSION [es_slow_query] ON SERVER   
  8. ADD EVENT sqlserver.rpc_completed(  
  9.     ACTION(sqlos.task_time,sqlserver.database_name,sqlserver.nt_username,sqlserver.sql_text,sqlserver.transaction_id)  
  10.     WHERE ([duration]>=(3000000))),  
  11. ADD EVENT sqlserver.sql_batch_completed(  
  12.     ACTION(sqlos.task_time,sqlserver.database_name,sqlserver.nt_username,sqlserver.sql_text,sqlserver.transaction_id)  
  13.     WHERE ([duration]>=(3000000)))   
  14. ADD TARGET package0.event_file(  
  15.     SET filename=N'D:\Program Files\Microsoft SQL Server\slow_query',   --存储路径及文件名前缀  
  16.     max_file_size=(10),     --最大文件大小,单位MB  
  17.     max_rollover_files=(4)) --启用文件滚动存储的最大文件数  
  18. WITH (  
  19.     MAX_MEMORY=4096 KB,             --最大内存大小  
  20.     EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,--事件保留模式:ALLOW_SINGLE_EVENT_LOSS/ALLOW_MULTIPLE_EVENT_LOSS/NO_EVENT_LOSS  
  21.     MAX_DISPATCH_LATENCY=30 SECONDS,--最大调度滞后事件,单位秒。0秒为无限制。  
  22.     MAX_EVENT_SIZE=0 KB,            --最大事件大小  
  23.     MEMORY_PARTITION_MODE=NONE,     --内存分区模式:无(NONE)/每个节点(PER_NODE)/每个cpu(PER_CPU)  
  24.     TRACK_CAUSALITY=OFF,            --因果关系跟踪,跟踪事件彼此相关的方式  
  25.     STARTUP_STATE=ON)               --服务器启动时是否启动事件会话  
  26. GO  
  27.   
  28. --  启用(停止)事件会话(START / STOP)  
  29. ALTER EVENT SESSION [es_slow_query] ON SERVER STATE=START  
  30. GO  

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

[sql]  view plain  copy
  1. --  针对每个加载到服务器地址空间的模块返回一行  
  2. SELECT * FROM sys.dm_os_loaded_modules t1  
  3. WHERE EXISTS(SELECT * FROM sys.dm_xe_packages t2 WHERE t1.base_address=t2.module_address)  


[sql]  view plain  copy
  1. --  对事件包显示的每个对象都返回一行( 可以是 事件/操作/目标/谓词/类型)  
  2. --  这里只查看 “操作”信息  
  3. SELECT * FROM sys.dm_xe_objects   
  4. WHERE name = 'task_time' AND object_type='action'  
  5. AND package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos'))  
  6. UNION ALL  
  7. SELECT * FROM sys.dm_xe_objects   
  8. WHERE name IN'database_name','nt_username','sql_text','transaction_id'AND object_type='action'  
  9. AND package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlserver'))  
  10. /*  
  11. sys.dm_xe_objects 查看包内容:  
  12. sqlos,sqlserver 和 package0 均为包名称。  
  13.   
  14. sqlserver.rpc_completed 为包中的事件;  
  15. sqlos.task_time,sqlserver.database_name 为包中的操作  
  16. package0.event_file 为包中的目标  
  17. [duration] 为包中的谓词,只是包名称没写出来  
  18. */  


[sql]  view plain  copy
  1. --  【每个包对应的每个内容!】  
  2. SELECT T1.name,T1.description,T2.name,T2.object_type,T2.description  
  3. FROM sys.dm_xe_packages t1  
  4. INNER JOIN sys.dm_xe_objects t2 ON T1.guid=T2.package_guid  

[sql]  view plain  copy
  1. --  返回一个内部数字键到可读文本的映射 (当前无信息)  
  2. SELECT * FROM sys.dm_xe_map_values  
  3. WHERE object_package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos','sqlserver'))  
  4. AND name IN'task_time' ,'database_name','nt_username','sql_text','transaction_id')  
  5.   
  6. SELECT * FROM sys.dm_xe_map_values T0  
  7. INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name  


[sql]  view plain  copy
  1. --  返回所有对象的架构信息  
  2. SELECT * FROM sys.dm_xe_object_columns T0  
  3. INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name  
  4. WHERE object_package_guid IN(SELECT guid FROM sys.dm_xe_packages WHERE name IN('sqlos','sqlserver'))  
  5. AND T0.name IN'task_time' ,'database_name','nt_username','sql_text','transaction_id')  
  6. AND T1.object_type='action'  
  7.   
  8. SELECT * FROM sys.dm_xe_object_columns T0  
  9. INNER JOIN sys.dm_xe_objects T1 ON T0.object_package_guid=T1.package_guid AND T0.name=T1.name  


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

[sql]  view plain  copy
  1. --  为每个服务器级事件通知对象返回一行  
  2. SELECT * FROM sys.server_event_notifications  
  3.   
  4. --  扩展事件  
  5. SELECT * FROM sys.dm_xe_sessions WHERE name = 'es_slow_query'  
  6. SELECT * FROM sys.server_event_sessions WHERE name = 'es_slow_query'  
  7.   
  8.   
  9. --  跟踪的事件  
  10. SELECT * FROM sys.dm_xe_session_events  
  11. WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')  
  12.   
  13. SELECT * FROM sys.server_event_session_events   
  14. WHERE event_session_id in(SELECT event_session_id FROM sys.server_event_sessions WHERE name = 'es_slow_query')  
  15.   
  16.   
  17. --  跟踪事件字段  
  18. SELECT * FROM sys.dm_xe_session_event_actions  
  19. WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')  
  20.   
  21. SELECT * FROM sys.server_event_session_actions t1  
  22. WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')  
  23.   
  24. --  绑定到会话的对象的配置值  
  25. SELECT * FROM sys.dm_xe_session_object_columns t1  
  26. WHERE EXISTS(SELECT * FROM sys.dm_xe_objects t2 where t1.object_package_guid=t2.package_guid and t1.object_name=t2.name )  
  27. AND event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')  
  28.   
  29.   
  30. --  目标信息  
  31. SELECT * FROM sys.dm_xe_session_targets  
  32. WHERE event_session_address IN (SELECT address FROM sys.dm_xe_sessions WHERE name = 'es_slow_query')  
  33.   
  34. SELECT * FROM sys.server_event_session_targets t1  
  35. WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')  
  36.   
  37. SELECT * FROM sys.server_event_session_fields t1  
  38. WHERE EXISTS(SELECT * FROM sys.server_event_sessions T2 WHERE T1.event_session_id=T2.event_session_id AND name = 'es_slow_query')  
  39.   
  40.   
  41. --  读取目标文件信息  
  42. SELECT type, data FROM sys.fn_MSxe_read_event_stream (N'D:\Program Files\Microsoft SQL Server\slow_query*.xel', 1)  
  43.   
  44. SELECT * FROM master.sys.fn_xe_file_target_read_file('D:\Program Files\Microsoft SQL Server\slow_query*.xel'NULLNULLNULL)  
  45.   
  46.   
  47.   
  48. --  查询结果  
  49. SELECT object_name as event,file_name,convert(xml, event_data) as xml_data  
  50. FROM master.sys.fn_xe_file_target_read_file('D:\Program Files\Microsoft SQL Server\slow_query*'NULLNULLNULL)  

[html]  view plain  copy
  1. <event name="sql_batch_completed" package="sqlserver" timestamp="2015-11-08T16:29:52.355Z">  
  2.   <data name="cpu_time">  
  3.     <value>0</value>  
  4.   </data>  
  5.   <data name="duration">  
  6.     <value>4023208</value>  
  7.   </data>  
  8.   <data name="physical_reads">  
  9.     <value>16</value>  
  10.   </data>  
  11.   <data name="logical_reads">  
  12.     <value>76</value>  
  13.   </data>  
  14.   <data name="writes">  
  15.     <value>0</value>  
  16.   </data>  
  17.   <data name="row_count">  
  18.     <value>2</value>  
  19.   </data>  
  20.   <data name="result">  
  21.     <value>0</value>  
  22.     <text>OK</text>  
  23.   </data>  
  24.   <data name="batch_text">  
  25.     <value>begin tran   
  26. update tab set name='kk' where id =1  
  27. waitfor delay '00:00:04'  
  28. update tab set name='kk' where id =2  
  29. commit tran  
  30. </value>  
  31.   </data>  
  32.   <action name="transaction_id" package="sqlserver">  
  33.     <value>0</value>  
  34.   </action>  
  35.   <action name="sql_text" package="sqlserver">  
  36.     <value>begin tran   
  37. update tab set name='kk' where id =1  
  38. waitfor delay '00:00:04'  
  39. update tab set name='kk' where id =2  
  40. commit tran  
  41. </value>  
  42.   </action>  
  43.   <action name="nt_username" package="sqlserver">  
  44.     <value>HZC\Administrator</value>  
  45.   </action>  
  46.   <action name="database_name" package="sqlserver">  
  47.     <value>Demo</value>  
  48.   </action>  
  49.   <action name="task_time" package="sqlos">  
  50.     <value>54284</value>  
  51.   </action>  
  52. </event>  

总的系统视图如下:

[sql]  view plain  copy
  1. --  扩展事件元数据信息  
  2. SELECT * FROM sys.dm_xe_packages  
  3. SELECT * FROM sys.dm_xe_objects  
  4. SELECT * FROM sys.dm_xe_map_values  
  5. SELECT * FROM sys.dm_xe_object_columns  
  6. SELECT * FROM sys.dm_xe_session_event_actions  
  7. SELECT * FROM sys.dm_xe_sessions  
  8. SELECT * FROM sys.dm_xe_session_events  
  9. SELECT * FROM sys.dm_xe_session_targets  
  10. SELECT * FROM sys.dm_xe_session_object_columns  
  11.   
  12. --  当前扩展事件信息  
  13. SELECT * FROM sys.server_event_notifications  
  14. SELECT * FROM sys.server_event_sessions  
  15. SELECT * FROM sys.server_event_session_events  
  16. SELECT * FROM sys.server_event_session_actions  
  17. SELECT * FROM sys.server_event_session_targets  
  18. SELECT * FROM sys.server_event_session_fields  
  19. SELECT * FROM master.sys.fn_MSxe_read_event_stream (N'deadlock*.xel', 1)  
  20. SELECT * FROM master.sys.fn_xe_file_target_read_file(N'deadlock*.xel'NULLNULLNULL)  
  21.   
  22. SELECT object_name as event,convert(xml, event_data) as xml_data  
  23. FROM master.sys.fn_xe_file_target_read_file(N'D:\deadlock*.xel'NULLNULLNULL)  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值