SQLSERVER2012里的扩展事件初尝试(下)
周未看了这两篇文章:
扩展事件在Denali CTP3里的新UI(一)
扩展事件在Denali CTP3里的新UI(二)
觉得在SQLSERVER2012开始,扩展事件的管理更加容易了,之前一直没有用过扩展事件
只是听过,看了文章的介绍,觉得扩展事件跟SQLSERVER PROFILER有很多相似之处
大家可以融会贯通
之前有一篇文章:扩展事件在Denali CTP1里的新功能
文章里说在SQLSERVER2012之前,扩展事件的所有操作只能用TSQL或C#代码来实现
现在SQLSERVER2012就方便多了,有了新的GUI,趋向于傻瓜了,对我来讲是好事o(∩_∩)o 哈哈
趁机学习一下扩展事件
简单介绍
首先打开SQLSERVER2012的SSMS,依次点击打开管理-》扩展事件-》会话
![](http://images.cnitblog.com/blog/257159/201312/15131246-83b403754fc54940aefd800184248635.jpg)
在会话文件夹中,点击右键-》可以新建会话/新建会话向导
![](http://images.cnitblog.com/blog/257159/201312/15164014-9d7cb84c3c2943ac8ccb6555cc0828d8.jpg)
在已有的会话中,点击右键-》启动会话、新建会话、导出会话、删除、属性
![](http://images.cnitblog.com/blog/257159/201312/15164044-f259d013b4914fd08e372c18ca4714da.jpg)
这些菜单已经很丰富了
点击-》新建会话向导 ,SQLSERVER会一步一步引导您怎麽新建一个会话
包括设置会话熟悉感、选择模板、选择要捕获的事件、选择要捕获的全局字段、设置事件会话筛选器、指定会话数据存储
![](http://images.cnitblog.com/blog/257159/201312/15164431-d1c5173f56494e588e5a05e5fc4710f9.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15164339-e351af05db674ebea119e46cab0c53e1.jpg)
这个向导我就不介绍了,我们一般都不喜欢用傻瓜的向导,生怕漏了什么东西没有设置
其实大家看到向导中要设置的步骤:选择模板、设置事件会话筛选器、选择要捕获的全局字段,有没有觉得和SQLSERVER PROFILER差不多的感觉
![](http://images.cnitblog.com/blog/257159/201312/15164851-738a034163744bae96d9523889ae8c4a.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15164859-87730473992e4c3599ce68ecddc858a5.jpg)
建立会话
我们新建一个会话
![](http://images.cnitblog.com/blog/257159/201312/15164218-529384befca149eb89d8d4b5bcee1cc2.jpg)
弹出 新建会话 对话框
![](http://images.cnitblog.com/blog/257159/201312/15165021-95be581ce1b94eefb4f27455d6d50546.jpg)
左边有常规、事件、数据存储、高级这些tab页
等一下会陆续介绍
常规页面
输入会话名称
![](http://images.cnitblog.com/blog/257159/201312/15165249-65bb929a385b46d4aac607ad3772288b.jpg)
在sql profiler里面就是输入跟踪名称
![](http://images.cnitblog.com/blog/257159/201312/15165338-3b00cc30997f4f87ac2b2173fefef8ce.jpg)
下面有一些选项,例如在服务器启动时启动事件会话,你可以根据自己实际情况进行勾选
![](http://images.cnitblog.com/blog/257159/201312/15165450-eb21418e96b448ea858bba4ab6b12ca6.jpg)
大家知道开启sql profiler会对SQLSERVER的性能造成影响
那么,从下面的“在服务器启动时启动事件会话”
这里告诉我们两个信息
信息一:自动化程度高了,以往我们都是重启服务器就需要自己手动打开sql profiler来重新跟踪SQLSERVER的事件,现在有这个选项就方便多了
不用手动打开扩展事件
信息二:扩展事件对SQLSERVER的性能损耗不大
在园子里的燕洋天大侠的文章大话扩展事件第一篇:概述(上)里提到:
扩展事件的出现与设计主要是以性能为主要的出发点
我们可以使用一个文件目标对象在相关的时间发生之后将信息写入到文件中,这样就非常的轻量级了,并且可以精确到事件发生点
![](http://images.cnitblog.com/blog/257159/201312/15174653-a8d0f6fbafd646ac8372e6f43e998fdc.jpg)
我们在会话名称里输入“blogtest”
![](http://images.cnitblog.com/blog/257159/201312/15165633-915e288d9961494b9ecc1903510a3926.jpg)
会话中也提供了很多模板给我们使用
就像sql profiler里面
![](http://images.cnitblog.com/blog/257159/201312/15165716-f1c76e992d5d4a47b24e1342d270da07.jpg)
在文章扩展事件在Denali CTP3里的新UI(一)中也说了
我们支持与Profiler里模板类似的概念,只要选择一个模板,Event(包括Action和Predicate)和Target以及某些选项就自动选择好了
但是在CTP3里只有一个Standard模板,这个模板所选择的事件和Profiler里的Standard模板相对应
你也可以把自己创建的Session作为模板保存起来以备后用,保存模板只需要右键点击某个Session然后选择Export Session…即可
因为那篇文章出来的时候SQLSERVER2012也只是CTP3的阶段,所以那时候只有一个标准模板,现在SQLSERVER2012出来了
已经多了很多模板了
![](http://images.cnitblog.com/blog/257159/201312/15170108-7b4002daac5943abac976a2075c075c4.jpg)
导出会话就相当于导出模板了
![](http://images.cnitblog.com/blog/257159/201312/15170125-425f98ee63c34e13aad47508cf2658f9.jpg)
sql profiler里导出模板
![](http://images.cnitblog.com/blog/257159/201312/15170222-e3af3691da4844b3afa2de1ff57c3867.jpg)
导入会话模板
在新建会话对话框里选择模板的下拉列表有一个 <从文件...>
![](http://images.cnitblog.com/blog/257159/201312/16091641-c7c656f8e87245c29f7fb1cbcfe8d61a.jpg)
![](http://images.cnitblog.com/blog/257159/201312/16091651-3dc3d08c257b4f2c861859fb5c19a05a.jpg)
事件页面
事件页面是最复杂的,你首先看到它分为左右两部分,左边是事件库,所有在SQL Server里注册的扩展事件都列在这里,右边是你选择的事件。
![](http://images.cnitblog.com/blog/257159/201312/15170633-575eae6d510a4dc89dd9d90d95465117.jpg)
在选择事件的时候,你可以点击名称列表头,进行事件名称的首字母进行顺序或者倒序排序,
![](http://images.cnitblog.com/blog/257159/201312/15195416-618c430a472546c4a1426928e91ceeff.jpg)
类别和通道也是可以排序的
![](http://images.cnitblog.com/blog/257159/201312/15195551-27b3a9621f3749f7906d98e5f4756eb2.jpg)
事件的类别非常多,包括cdc功能的事务日志扫描、死锁监视、高度可用性和数据的安全性(High Availability and Disaster Recovery,HADR)、垃圾回收等等
![](http://images.cnitblog.com/blog/257159/201312/15195715-367e70cc469e494480b71726c05ba0ed.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15195722-93b8d50e5daa4f5a9d9aa851381c8e5e.jpg)
事件过滤,比如我在在事件库的输入框里输入sql_,所有名字含有sql_字样的事件都被列了出来并且高亮显示
![](http://images.cnitblog.com/blog/257159/201312/15200700-e47e7388b18d440f84f1c76b0ce66939.jpg)
过滤也可以按照事件名称和说明、仅事件字段、全部来进行过滤
![](http://images.cnitblog.com/blog/257159/201312/15200933-32a008b4f90447d69c245051e7b18332.jpg)
类别和通道的类似于EXCEL的列筛选
![](http://images.cnitblog.com/blog/257159/201312/15201621-bb8affc2b9c44a0daae71b0fa336332a.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15195715-367e70cc469e494480b71726c05ba0ed.jpg)
我们选择sql_statement_starting和sql_statement_completed事件
![](http://images.cnitblog.com/blog/257159/201312/15202123-461136fbd3f14426a25efb226e61e1e0.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15202133-5a94f7071f0a48748fb46be4ccc81660.jpg)
点击所选事件页面右上方的配置按钮,页面将会滑动
![](http://images.cnitblog.com/blog/257159/201312/15202347-713bf8bf0d3b4d03826dbdaa05994c50.jpg)
配置事件页面
你可以点击“选择”返回刚才的事件库页面
你会看到闪电和漏斗图标分别出现在了右边配置页面的全局字段(操作)标签和筛选器(谓词)标签上
![](http://images.cnitblog.com/blog/257159/201312/15203604-f55bf230920b405aa7e5e919be4cae74.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15203727-a89d1f989d1d41269eef531d12e35a8c.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15210023-6f98a00716d446e59171e3d49fe284c3.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15210038-b1dc769795b44b96b660292cf1d36e3f.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15210045-03a32b36ea704f7aa2b4cf5dd7cfb1e1.jpg)
闪电代表的是该事件上有多少Global Fields(Actions)关联
漏斗代表该事件有没有Filter(Predicate)关联
SQLSERVER Profiler里每个事件都含有EventSequence列,而在XEvent里则被作为Action来实现了。
![](http://images.cnitblog.com/blog/257159/201312/15204438-6f438326149d4d3fb10329bd86e37537.jpg)
Predicate可以减少不必要的事件收集,比如我可以配置sql_statement_starting事件的Predicate为database_name=’Northwind’,
那么发生在其他数据库的sql_statement_starting事件就不会被该Session所收集,Profiler可以为所有事件设置一个Column Filter,
而XEvent支持为每个Event设置各自独立不同的Predicate
![](http://images.cnitblog.com/blog/257159/201312/15204607-e3138ffec1ad45578912e8eae179ef31.jpg)
事件字段(Event Fields)标签列出所有该Event的列,某些Event会把一些开销比较大的列作为可选的列,你可以点击前面的CheckBox选择是否收集该列数据,
比如sql_statement_starting的statement列就可以被取消选择。
![](http://images.cnitblog.com/blog/257159/201312/15205210-1c1494474daf48d0b4b5d6495bb52eeb.jpg)
你可以同时选择多个事件并选择/取消全局字段(操作)或配置筛选器(谓词)
在这里我们为sql_statement_starting和sql_statement_completed事件,在全局字段(操作)里选择database_name
![](http://images.cnitblog.com/blog/257159/201312/15205639-cb9e4dd8d9004736aa0ba57aa8c21618.jpg)
不添加谓词并保持事件字段为默认值。
完成之后在闪电和漏斗列会显示相应的动作和谓词的数量
如果配置谓词错误,在漏斗列会显示 打叉
![](http://images.cnitblog.com/blog/257159/201312/15210331-e9ed840e37e84938aaa985a91c17b0eb.jpg)
我们删除子句就可以了
![](http://images.cnitblog.com/blog/257159/201312/15210455-3a2c19e684854d52ba6d2c9a591596d5.jpg)
配置完毕之后,会看到sql_statement_starting(事件)和sql_statement_completed(事件)后面的闪电图标列有一个动作与之关联
![](http://images.cnitblog.com/blog/257159/201312/15210618-08737a8b64d74bf1bee0581a2d2bc563.jpg)
数据存储页面
在这个页面里可以选择为Session添加不同的目标(Target)
![](http://images.cnitblog.com/blog/257159/201312/15210844-16983571216746ec882e24be98a9ed76.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15211128-4479aa4ccc6147e7ad6206a3cb585f8d.jpg)
这里我们选择event_file 目标并保持默认配置
![](http://images.cnitblog.com/blog/257159/201312/15211812-65976cc15f8745128cf195cb83cd7385.jpg)
高级页面
![](http://images.cnitblog.com/blog/257159/201312/15212656-42996c101a3e421a9960e84c0e05a0d1.jpg)
高级页面可以设置控制会话行为的高级选项,有一个选项需要特别注意,”最大调度滞后时间(Maximum dispatch latency)”
它描述了事件从被触发到写入到Target最长的等待时间,默认值是30秒,如果你使用和SQLSERVER Profiler client-side tracing
类似的Live Monitoring功能,你可能会希望把它改小,这样事件被触发后可以尽快地显示在SSMS里,
但需要注意到的是改小它会增加SQL Server的开销,这里我们把它改成5秒
完成创建
点击“确定”完成事件会话的创建
![](http://images.cnitblog.com/blog/257159/201312/15212900-3f27e079be3d4764868895080d3ce699.jpg)
blogtest 会话将会被创建成功并显示在Object Explorer里
![](http://images.cnitblog.com/blog/257159/201312/15213059-ddc8da25f5764cf08e9145b42d6b02e9.jpg)
在会话被创建后,你可以在Object Explorer里右键点击该Session并选择属性,这将打开和创建会话相同的对话框,进行修改后点击确定即可。
![](http://images.cnitblog.com/blog/257159/201312/15213128-eaa2d74e45f24899a44087e64c47afa1.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15213200-d417a1159b5b4e68a324516534d6f30b.jpg)
如果你想查看怎麽用TSQL语句的方式能创建刚才blogtest事件会话,可以用编写脚本的方式
![](http://images.cnitblog.com/blog/257159/201312/16092028-14fff2f0ce6c41408e6d4fd534414b9b.jpg)
1 CREATE EVENT SESSION [blogtest] ON SERVER
2 ADD EVENT sqlserver.sql_statement_completed(SET collect_statement=(1)
3 ACTION(sqlserver.database_name)),
4 ADD EVENT sqlserver.sql_statement_starting(
5 ACTION(sqlserver.database_name))
6 ADD TARGET package0.event_file(SET filename=N'D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log\blogtest.xel')
7 WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
8 GO
启动会话并监视
启动会话
![](http://images.cnitblog.com/blog/257159/201312/15213618-2d22f70b6e1149b8934d99b1a63c5291.jpg)
监视实时数据
![](http://images.cnitblog.com/blog/257159/201312/15213648-0f2b337130bc4e0d8e7c6ae42b74dc03.jpg)
当点击“监视实时数据”按钮,就会新建一个窗口
![](http://images.cnitblog.com/blog/257159/201312/15214112-ce2ae281caf6450dacfbb0f1799abe1b.jpg)
![](http://images.cnitblog.com/blog/257159/201312/16091246-5afa7f2fa8d141c7818ba97956eebd5a.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15214145-3d631a58bd2747e99d2d04b0c651f4da.jpg)
运行了一下,事件数量就不断上升
![](http://images.cnitblog.com/blog/257159/201312/15214618-c2b0982bdba845389855420332cf060f.jpg)
我们停止会话
![](http://images.cnitblog.com/blog/257159/201312/15214640-cd995ccd96164dbd9acd54d78f7ab527.jpg)
但是似乎SQLSERVER有些问题
![](http://images.cnitblog.com/blog/257159/201312/15214701-96fcb8251c6b4c3a8f13deb1b872be11.jpg)
我以为SQLSERVER会删除了blogtest这个会话,然后我刷新了一下会话节点,没有删除,似乎SQLSERVER在这个地方有些bug
又或者是我自己操作不正确
![](http://images.cnitblog.com/blog/257159/201312/15214731-5755dcdc11c84100a9e40fbd8c8536fc.jpg)
xel文件
我们看一下D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log路径下的情况
我刚才停止了会话,又重新启动了会话,所以会产生两个blogtest xel文件
这里要注意一下,刚才我们在 数据存储 页面,默认的设置值是:勾选了启用文件滚动更新,并且在最大文件数里设置为5
这里跟SQL ERROR LOG是一样的,当blogtest这个会话产生的xel文件的文件数达到5个,就会删除最早的那个xel文件
然后生成一个新的xel文件
![](http://images.cnitblog.com/blog/257159/201312/15222019-70f213c36e6441eeb9e90eb2d50fa5ce.jpg)
SQL ERRORLOG也是一样是滚动更新的,这里就不再详细叙述了~
![](http://images.cnitblog.com/blog/257159/201312/15222421-1c2dd8c7fa204d42b6af5e046b917012.jpg)
system_health xel文件是安装SQLSERVER的时候已经创建好的
system_health 扩展事件会话
此会话源自产品支持团队的想法,它可以跟踪通常被用来对客户系统进行调试的信息
(例如当客户系统发生死锁或出现其它严重错误时)
此会话的创建和启动是 SQL Server 2008 实例安装过程的一部分
它在环缓冲区中跟踪事件,因此不会消耗太多内存.
SQL Server 2008使用扩展事件进行高级故障排除
![](http://images.cnitblog.com/blog/257159/201312/15215117-7ccb1e957700458993ac1b798e339f93.jpg)
![](http://images.cnitblog.com/blog/257159/201312/15214948-16e4c3ff63694e0b8df1bb82275ce4e3.jpg)
我们用editplus打开,发现都是二进制的,我还以为是XML格式的
![](http://images.cnitblog.com/blog/257159/201312/15215333-d1962118072844b5a00af5f9bc8226e2.jpg)
查看收集回来的xel文件
如果你想查看收集了一个晚上的xel文件,你可以直接把xel文件拖进去SSMS就可以了
![](http://images.cnitblog.com/blog/257159/201312/16092434-b1e0077a11884e468fd82bc50e76068b.jpg)
上面那个blogtest_0_130315881898000000.xel一共收集了474个事件
不过扩展事件的文件名好像没有什么规律,如果别人给你一个xel文件叫你分析一下例如下图那个,从文件名你只能知道是2013年16日收集的事件信息
![](http://images.cnitblog.com/blog/257159/201312/16094942-aa93702000c24e6eb7772c17e01e265b.jpg)
我们看一下扩展事件的结构
![](http://images.cnitblog.com/blog/257159/201312/16195629-268d2aac64104745988a226a3b664782.gif)
大家点击加号,会看到事件会话下面会有一个包
![](http://images.cnitblog.com/blog/257159/201312/16195658-bd1386a9a9e8479a8c8755c296a1f6d4.jpg)
我们右键点击查看目标数据
![](http://images.cnitblog.com/blog/257159/201312/16195752-aa2d77c0dd6344c0921851113abca59e.jpg)
就会弹出一个新窗口
![](http://images.cnitblog.com/blog/257159/201312/16200035-acd602559c95413094d257d743a973c1.jpg)
上面弹出的新窗口显示了下面五个xel文件的所有事件,这样就不用每个文件逐个逐个地拖到SSMS里面看了,更不用打开文件资源管理器
![](http://images.cnitblog.com/blog/257159/201312/16195954-3649b0bdf72d4051ace2a0090b3b130c.jpg)
大家不相信的话,可以把这五个xel文件拖到SSMS,然后相加起来,看是不是跟包的事件数目是一样的
总结
这一篇简单介绍了 扩展事件的创建和一些概念,下一篇会继续讲述如何用扩展事件来显示和分析数据
将试图找到一个workload中平均开销最大的query
个人感觉扩展事件跟SQL profiler真的很相似
SQL profiler把跟踪到的事件写入到trc文件
而扩展事件把事件信息写入到xel文件
而监控实时数据相当于在SQL profiler里开启跟踪,只不过一个在SQL profiler软件里查看跟踪的事件,而另一个直接在SSMS里查看事件
我觉得扩展事件就像把SQL profiler集成到SSMS里面一样,当然扩展事件的机制跟SQL profiler是不一样的
![](http://images.cnitblog.com/blog/257159/201312/16103905-a7a0ce28829f4e73831be7808c859129.jpg)
![](http://images.cnitblog.com/blog/257159/201312/16135626-47e6c48bd66143bd9566aad5ac9ac0dc.jpg)
参考文章:
SQL Server 2008使用扩展事件进行高级故障排除
大话扩展事件第一篇:概述(上)
大话扩展事件第一篇:概述(下)
王成辉:用XEvent做高级Troubleshooting
如有不对的地方,欢迎大家拍砖o(∩_∩)o