设为首页 收藏本站
查看: 1159|回复: 0

[经验分享] SQL 扩展事件

[复制链接]

尚未签到

发表于 2017-7-14 17:44:45 | 显示全部楼层 |阅读模式
  在本篇,我通过使用新建“Session ”对话框来创建新的扩展事件会话。定义一个自己的扩展事件,动作和谓词,并且发布一个以收集事件数据为目的的会话。

首先从UI开始
  在SQLServer2008R2以后(不包括2008R2),才引入扩展事件的内置UI。2008的版本可以通过安装插件的形式或者使用T-sql语句来实现扩展事件。如果是2012以后的SSMS客户端,也可以访问2008 的数据库实例,但是看不到扩展事件UI。在2008版本中缺少UI,意味着必须写T-SQL和XQuery来挖掘事件数据。2012以后提供了UI来读取2008版本中的目标文件,同时也能使用UI来进行事件数据分析。
  一下的实例都是以SQLServer 2012版进行,为了使用SSMS中的扩展事件,首先在对象浏览器中打开Management | Extended Events,在打开Sessions ,看到当前实例的会话时间的列表。打开后你能看到内置的两个扩展事件,AlwaysOn_health and system_health 。
DSC0000.png

  图1
  需要注意,扩展时间的优点之一就是事件会话保存于服务器的元数据中,因此默认重启后保存在实例中,然而追踪定义则不是,在重启后必须要执行一个自定义的存储过程来重新创建追踪。扩展事件很好的解决了这些繁琐的配置。  
  首先,当我们建好扩展事件以后可以选择会话—>编写会话脚本—>Create 到—>新建查询编辑窗口,得到扩展时间的创建语句。这个语句是与以前我们自己编写的脚本略有不同的。
  其次,SQLServer 包含一个with脚本结尾的一些会话级别的选项。这些选项都是默认的。



CREATE EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER
ADD EVENT sqlserver.rpc_completed (
ACTION ( sqlserver.client_app_name
, sqlserver.database_id
, sqlserver.server_instance_name
, sqlserver.session_id
)
WHERE
( logical_reads >= 10000 ) ),
ADD EVENT sqlserver.sql_statement_completed (
ACTION ( sqlserver.client_app_name
, sqlserver.database_id
, sqlserver.server_instance_name
, sqlserver.session_id
)
WHERE
( logical_reads >= 10000 ) )
ADD TARGET package0.event_file (  SET filename = 'C:\temp\XE_ReadsFilter_Trace.xel' ,
max_file_size = ( 5 ) ,
max_rollover_files = ( 1 ) )
WITH (  MAX_MEMORY = 4096 KB ,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
MAX_DISPATCH_LATENCY = 30 SECONDS ,
MAX_EVENT_SIZE = 0 KB ,
MEMORY_PARTITION_MODE = NONE ,
TRACK_CAUSALITY = OFF ,
STARTUP_STATE = OFF )
GO

  代码1
  我们使用UI创建一个新的事件会话,行为和属性,在过程的结束,又将构建这个扩展事件的语句输出了出来。

在UI创建一个新的事件会话
  既可以使用新建会话向导或者新建会话。但是,向导可选项比较少,因此不推荐使用。所以我们重点介绍新建会话。
  创建新的扩展事件,只需要邮件会话的文件夹,然后选择新建会话…对话框有四个属性页:常规,事件,数据存储和高级。
DSC0001.png


常规页
  在常规页,我们可以输入事件名称,并且开启一些选项。这里我输入 HighReadQueries 作为名称,要求名称必须唯一 。 DSC0002.png
  图2.常规页

事件页
  下一步就是加一些事件,切换到事件页,选择我们选择我们打算追踪的事件并且配置他们。设定合适的操作和谓词。

添加事件
  为了创建一个事件会话,一定要至少有一个事件。下面例子中,加入了两个事件,sqlserver.sql_statement_completed 和sqlserver.rpc_completed。这里可以搜索到所有的事件库,很多我们已经忘记的。在这个分析器中总共有180个时间供你选择,找到需要的。下面再事件库下面的输入框中输入completed ,下面的对话框自动将包含这个单词的事件筛选出来少于15个的事件。
DSC0003.png

  图3
  注意类别/通道这两个事件的列,基于关键字和通道的分类系统,被windows事件追踪所使用。这里不深入讲解了,理解就行。
  双击要选中的两个事件,然后它们出现在右侧的列表中:然后点击配置按钮,添加动作和谓词。
DSC0004.png

  图4

配置事件
  事件配置选项由三个tab组成,全局字段,过滤和事件字段。

默认收集(事件字段)
  事件字段标签展示事件所有列字段,构成事件的默认收集字段,有些开销较大的字段是可选收集与否的,如下图的data_stream…
DSC0005.png

  图5
  不同的事件有不同的默认捕捉事件数据。

添加操作
  下面我们可以在全局字段tab中为两个事件添加需要的操作。操作也被称为全局字段,因为这些字段不特指任何独立事件,是公用的。
     为了加上操作,只需要选中选择框。也可以把一个操作加到多个事件上,高亮两个事件,然后选中操作即可。这里我们把client_app_name, database_id, server_instance_name, 和session_id 加到这两个事件上。
DSC0006.png

  图6
  上述操作是普遍良性的。而扩展事件也提供额一下副作用的操作。例如debug_break字段就会引起调试中断。
  设定过滤
  最后,选择过滤tab来配置任意谓词。为了缩短事件估计,阻止扩展事件引擎收集没必要的数据,需要配置一个谓词来过滤事件数据。谓词配置和缩短逻辑是极其重要的。
  例如,选中两个事件,然后从下拉列表选择logical_reads(逻辑读),改变操作符列为>=,然后输入10000。在这种配置下,我们的会话仅仅捕捉sqlstatement 或者存储过程执行超过时10000的逻辑读的事件。
DSC0007.png

  图7
  这种选择多个功能,加入相同的谓词给两个事件,限制了可利用的全局字段和俩个事件的普通字段。根据时间的选择,不是所有的字段都可以使用。例如,加入我们加入error_reported event事件,那么选择这三个事件时,逻辑读这个谓词就不能使用了。如下图
DSC0008.png

  图8
  在这个例子中,我们配置相同的谓词给两个事件,但是我们也可以灵活的配置每一个事件。
  此刻,我们可以选择OK来创建事件会话完成会话,因为满足了最低要求。定义事件会话的目标是非必要的。例如,我们配置error_reported 事件加入create_dump_single_thread操作,没必要保存抓取数据。下面我们将介绍如何定义目标文件。

数据存储页:定义目标文件
  选择数据存储也然后目标下面选择类型,选择event_file。接着下面输入文件名,选择浏览输入文件的输出位置。路径的最大长度是260个字符。例子中使用的是D:\temp\HighReadQueries。这里不需要包含文件的默认扩展名.xel。扩展事件引擎会附_0_和一个整性数字(文件创建时间到1600年1月1日的秒的数字)来作为文件结尾,保证文件名是唯一的。该文件类型提供了选项来设置最大文件的值,并且允许多次反复使用文件。如果没有指定文件最大值,则文件将会增长至填满驱动为止。
DSC0009.png

  图9

高级会话选项
  在高级选项页面,能看到额外的高级的会话选项。这里我们可以今后讨论,这里保持默认即可。

事件会话DDL
  选择OK来完成会话,然后这个会话出现在扩展事件->会话的文件夹下,然后发现他是激活的,因为我们在一开始我们选择了可选框—创建会话后立即开启事件会话。生成T-SQL脚本,选择脚本按钮点击OK或者创建完成后右键输出创建脚本到查询窗口(之前介绍了)。这里我加上了相应的注释,以便理解。



/*Create the session, named as specified on the General page*/
CREATE EVENT SESSION [HighReadQueries] ON SERVER
/*Add and configure events, actions and predicates, as specified on the Events page*/
ADD EVENT sqlserver.rpc_completed (  
ACTION ( sqlserver.client_app_name,
sqlserver.database_id,
sqlserver.server_instance_name,
sqlserver.session_id )
WHERE ( [logical_reads] >= ( 10000 ) ) ),
ADD EVENT sqlserver.sql_statement_completed (  
ACTION ( sqlserver.client_app_name,
sqlserver.database_id,
sqlserver.server_instance_name,
sqlserver.session_id )
WHERE ( [logical_reads] >= ( 10000 ) ) )
/*Add and configure a target, as specified on the Data Storage page*/
ADD TARGET package0.event_file ( SET filename = N'C:\temp\HighReadQueries' )
/* Set Session-level options, specified on the General and Advanced pages*/
WITH ( MAX_MEMORY = 4096 KB ,
EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS ,
MAX_DISPATCH_LATENCY = 30 SECONDS ,
MAX_EVENT_SIZE = 0 KB ,
MEMORY_PARTITION_MODE = NONE ,
TRACK_CAUSALITY = OFF ,
STARTUP_STATE = ON );
GO

  代码2
  与我们之前的代码很像。除了有会话立即开始,我们还选择了”捕获实时在屏幕上监视数据“。一个新的窗口被打开来显示被事件会话捕捉的数据,就像Profiler做的一样。但是不同的时,当观察实时数据引起系统性能问题时,监视器将会自动关闭。

总结
  完成后,我们已经熟悉了扩展事件,比如创建基本会话,捕捉一个或者多个事件信息,收集操作的数量,使用简单的谓词,写入文件等等。可视化操作大大减轻了脚本的难度,也提供了很多基础信息的选择,大大方便了扩展事件的开发。这块只是开始应用,希望有大神能指点一下。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-393911-1-1.html 上篇帖子: SQL Injection绕过技巧 下篇帖子: SQL递归查询知多少
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表