本文属于 SQL Server 扩展事件(Extented Events)从入门到进阶 系列

第一篇文章中提到了如何在Profiler中创建跟踪(trace),并以服务器端(server-side)跟踪方式运行以便在服务器上创建实际跟踪文件。接着把跟踪定义转换到扩展事件的CREATE EVENT SESSION脚本中。

上一篇文章可以成为你从SQL Trace通往扩展事件(Extented Events/xEvents,为后续编写方便,本人尽可能使用xEvents替代扩展事件)的桥梁。同时,上文也从中展示了如何把现有的跟踪库转成xEvents。

但是你应该如何从零开始创建一个新的xEvents?当然T-SQL完全可以实现。虽然从SQL 2008开始引入xEvents,但是真正集成到SSMS(即GUI)中还是从SQL 2012开始,所以如果你要在2008中使用,只能使用T-SQL。从SQL 2012开始,就可以使用GUI来实现。作为扩展事件入门的切入点,从SSMS开始是不错的选择,也正是本文的目的所在。
本节会通过GUI界面,创建一个新的事件会话(event session),并对其定义、启用、筛选和建立会话目标从而实现数据收集。

从GUI开始:

在SQL Server 2008/2008 R2中,没有xEvents的GUI界面可供使用,如果你正在使用这些版本又希望使用扩展事件,那么要么使用T-SQL操作,要么就在SQL 2012的SSMS中进行(无论是SSMS 2012直连2008实例还是在2012中建好然后把脚本在2008实例中执行)。
本系列中,推荐使用SQL 2012及以上版本。当你在SSMS中使用扩展事件时,可以通过下图所示展开:

正如在上一文中提到过,xEvents的其中一个优势是事件会话定义存储在服务器的元数据中,即使重启也会默认启动,而trace却需要手动或者经过某些配置来实现,比如在重启后自动运行某些自定义存储过程来启动跟踪。另外我们也可以有多个事件会话,但是不启用。虽然trace也能实现,但是因为trace的输出文件需要硬编码到定义中,而且如果我们停止跟踪重新启动的话,要确保输出文件名不存在,或者配置跟踪定义允许其滚动使用同一个文件。而xEvents解决了这个问题,在本文后续部分会介绍。

右键上图的“XE_ReadsFilter_Trace”会话,然后按下图选择,把会话定义显示在新建窗口中,这段代码有第一篇中的sp_SQLskills_ConvertTraceToExtendedEvents存储过程生成,但是对比两部分的代码可以看到一些细节差异。首先,SQL Server中存储的代码不在包含注释。

其次,SQL Server产生的代码最下方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 = 'D:\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

接下来,我们使用GUI来创建一个相同的事件会话,但是为了避免重名冲突,会使用另外一名字,然后使用SQL Server生成的脚本对比两者的区别。

在GUI中创建新的事件会话:

当使用SSMS创建时,可以选择使用【新建会话向导】或者【新建会话】如下图来实现。但是向导只是【新建会话】的功能子集,不建议常规使用。所以我们这里使用【新建会话】对话框来演示。
选择【新建会话】,然后会显示出下图内容,下面简要介绍一下:

常规页:

在常规页中,输入事件会话的名称并激活一些会话选项以便创建之后就能运行,并且可以使用live data viewer来查看事件数据。这里输入一个“HighReadQueries”作为事件会话名,关于“因果关系跟踪”选项在后续介绍。如下图:






事件页:


第二步就是添加事件到会话中。选择【事件】选项页,可以选择需要跟踪的事件并对其进行配置、添加操作和限定等。

添加事件:

通过界面创建会话时,必须添加最少一个事件。比如,我们想添加两个事件:sqlserver.sql_statement_completed和sqlserver.rpc_completed。我挺喜欢这个界面的搜索功能。如果单纯使用滚动条,可能会耗费数分钟、数小时数天等等。因为里面有包含在Profiler中的180个事件,从中找一个你需要的是非常痛苦的事情。通过搜索,可以很快定位。

比如在“事件库”中输入“completed”,然后自动会触发搜索,从数百个事件中筛选出少于15个:

注意【类别/通道】两列,这是基于Windows事件跟踪(Event Tracing for Windows,ETW)分类系统的。这部分在后续章节介绍。

但是这里没有显示所有“_completed”事件,因为默认情况下,GUI不现实debug通道事件。你可以展开【通道】列的箭头,会发现debug是没选中的,如图:

如果勾选这个debug项,你可以发现多了几个事件。debug 事件的目的是给微软内部使用。也可以给数据库专家在进行深入Troubleshooting时使用,或者用来深入研究SQL Server内部特性时使用。但是基于其目的,微软不支持非内部人员这样使用,也不确保提供这种功能,同时可能会在后续版本中移除。

双击【所选事件】中的任意一个,界面就会平移到配置项,或者单击事件名然后点下图红圈中的按钮。这个配置页用于添加对应事件的操作和限定谓词。

这部分是作者唯一不喜欢的GUI功能,因为配置不能在同一个窗体内完成,需要平移。

配置事件:

这个界面包含三个选项页签:【全局字段(操作)】、【筛选器(谓词)】、【事件字段】,其中【事件字段】的内容就是默认负载。显示了每个事件的默认负载中会收集的事件字段(数据列):


在这两个事件中切换时可以看到不同的事件的默认负载略有不同。并且绝大部分不能移除。通过复选框可以控制是否收集。比如rpc_completed事件的statement部分是可以不收集的,但默认会收集,而output_parameters列是可选但默认不收集。这里我们不改动任何默认设置。

添加操作:

下面对两个事件添加操作,单击【全局字段(操作)】页,由于这些操作不是针对任何独立的事件,所以叫做全局字段。对特定事件添加操作,只需要勾选对应的复选框,如果对所有或者多个事件添加,需要同时选中所需的多个事件(按shift然后鼠标添加等),然后勾选右边的操作复选框。本例中我们对两个事件添加“client_app_name”、“database_id”、“server_instance_name”、“session_id”这四个操作。

上面这四个操作很轻量级,只是对事件添加一些明细信息。但是扩展事件也提供了一些有副作用的操作,称为“副作用操作”(side-effecting actions)。比如,debug_break操作会在事件触发时引发一个debug断点,另外“create_dump_all_threads”、“create_dump_single_thread”会触发SQL Server记录下所有或者正在运行的线程的内存使用情况。由于引擎在同一个线程中执行这些操作,所以这些操作会降低性能,需要谨慎使用。这部分在下文介绍。

设置筛选条件(谓词):

最后,我们通过【筛选器(谓词)】页配置筛选条件。除了少数特殊情况之外,都应该对每个事件配置筛选条件,以便实现“短路(short-circuit)”事件评估,并且避免扩展事件引擎收集不必要的数据从而增大整体开销。筛选配置和短路逻辑极其重要,下节会做详细介绍。

在本例中,高亮所有事件,然后在【字段】列的下拉框中选择【logical_reads】,【运算符】列选择【>=】,【值】列输入100000,通过这些配置,事件会话只会收集超过10000逻辑读的SQL语句或者存储过程:

这里是对所有事件进行指定筛选条件,使得全局通用的筛选都能应用于多个事件中。但是根据事件的不同,并不是所有的字段都是可用的。比如如果添加了error_reported事件,并且选择了三个事件,那么就看不到“logical_reads”这个操作符,甚至你会发现完全不可选:

在这个例子中,对两个事件添加了相同的谓词,但是我们也可以对每个事件单独配置,这一点在SQL Trace中是不可能的。

在配置完之后,点击【确定】来创建事件会话。因为已经添加了最少一个事件,已经满足了最低要求。在这里并不强制定义事件会话的目标。这种免选择对一些事件来说是合理的。比如配置带有create_dump_single_thread这种副作用操作的error_reported事件,就没有必要非要指定目标,我们想要的数据(一个文件)将在特定错误发生时会创建。

由于本例中我们只是配置针对会话的目标,所以对数据存储非必要。但是下面还是介绍一下。

数据存储页:定义目标

在【数据存储】页中,选择目标中的【类型】为“event_file”,点击【event_file】之后,下方会出现【属性】部分,在【服务器上的文件名】选择【浏览】然后输入文件存储地址。在SQL 2012中,文件的完整路路径会自动填充,而在SQL 2014中,仅提供文件名,但是会使用默认路径(如:C:\Program Files\Microsoft SQL Server\MSSQL12.SQL2014\MSSQL\Log)。文件名的最大长度为260个字符,在本例中,使用D:\temp\HighReadQueries ,后缀名(.xel)非必要。
对于event_file事件来说,提供对最大文件大小的限定选项。并可以“启用文件滚动更新”功能。如果没有指定最大文件大小,那么文件会一直收集到硬盘空间满为止。






高级会话选项:

在高级页,可以设置一些额外的、高级的会话选项,会在后续章节介绍。所以不打算在这里展开。


事件会话DDL:

点击了【确定】之后,会话就创建了。现在再检查【扩展事件】→【会话】可以发现事件会话已经创建并且在运行。如下面第一个图,因为在常规页中勾选了【创建事件会话后立即启动会话】选项。然后我们通过GUI的导出脚本功能,见第二个图,生成事件会话的T-SQL脚本:








为了便于解释,对脚本进行了格式化和添加注释:
/*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] >= ( 100000 ) ) ),
ADD EVENT sqlserver.sql_statement_completed (
    ACTION ( sqlserver.client_app_name,
      sqlserver.database_id,
      sqlserver.server_instance_name,
      sqlserver.session_id )
    WHERE ( [logical_reads] >= ( 100000) ) )

/*Add and configure a target, as specified on the Data Storage page*/
ADD TARGET package0.event_file ( SET filename = N'D:\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


总结:

当完成这一节之后,你已经对使用SSMS GUI创建基础扩展事件会话已经足够熟悉了:如何收集一个或多个事件,一定数量的操作,简单的谓词和把结果写入文件。下一节会介绍:
SQL Server 扩展事件(Extented Events)从入门到进阶(3)——通过界面操作Extented Event

SQL Server 扩展事件(Extented Events)从入门到进阶(2)——在GUI中创建基础扩展事件的更多相关文章

  1. 在 Visual Studio 2010 中创建 SharePoint 2010 事件接收器

    Microsoft Visual Studio 2010 提供了一个可用于生成事件接收器的项目类型,事件接收器会在 Microsoft SharePoint 2010 网站上选择事件之前或之后执行操作 ...

  2. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  3. SQL Server Extended Events 进阶 2:使用UI创建基本的事件会话

    第一阶中我们描述了如何在Profiler中自定义一个Trace,并且让它运行在服务器端来创建一个Trace文件.然后我们通过Jonathan Kehayias的 sp_SQLskills_Conver ...

  4. SQL Server(MSSQLSERVER) 请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。

    转自:https://www.fengjunzi.com/blog-25573.html 问题 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务 ...

  5. SQL Server 2012附加数据库时,错误提示如下:尝试打开或创建物理时,CREATE FILE 遇到操作系统错误 5(拒绝访问。)

    错误提示:Create File遇到操作系统错误5(拒绝访问) 解决方案: 在所有程序-SQL Server 2012-"SQL Server 配置管理器",点击"SQL ...

  6. EntityFramework_MVC4中EF5 新手入门教程之四 ---4.在EF中创建更复杂的数据模型

    在以前的教程你曾与一个简单的数据模型,由三个实体组成.在本教程中,您将添加更多的实体和关系,并通过指定格式. 验证和数据库映射规则,您将自定义数据模型.你会看到自定义的数据模型的两种方式: 通过添加属 ...

  7. SQL SERVER 2008:内部查询处理器错误: 查询处理器在执行过程中遇到意外错误

       今天一个同事突然告诉我,以前跑得很正常的一个SQL语句,执行时突然报如下错误:         消息1222,级别16,状态18,第1 行         已超过了锁请求超时时段.        ...

  8. SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events

    由于工作需要,决定深入研究SQL Server的扩展事件(Extended Events/xEvents),经过资料搜索,发现国外大牛的系列文章,作为“学习”阶段,我先翻译这系列文章,后续在工作中的心 ...

  9. SQL Server中的扩展事件学习系列

    SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...

随机推荐

  1. ES6 new syntax of Rest and Spread Operators

    Rest and Spread Operators.md Why we need rest and spread operators? var showCollections = function(i ...

  2. 获取 Let's Encrypt 免费通配符证书实现Https

    说明 3月14日,Let's Encrypt的执行董事Josh Aas对外宣布,他们的通配符证书正式上线,用户可以基于此特性轻松部署/开启所有子域名的HTTPS功能. Let's Encrypt 是国 ...

  3. [LeetCode] Max Chunks To Make Sorted 可排序的最大块数

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...

  4. Java中对象比较的方法

    class Person{ private String name; private int age; public Person(String name,int age){ this.name = ...

  5. 【bzoj4570 scoi2016】妖怪

    题目描述 邱老师是妖怪爱好者,他有n只妖怪,每只妖怪有攻击力atk和防御力dnf两种属性.邱老师立志成为妖怪大师,于是他从真新镇出发,踏上未知的旅途,见识不同的风景. 环境对妖怪的战斗力有很大影响,在 ...

  6. 使用word

    同样这也是生活中常用到的办公软件,word本质是一个排版软件,它与一般的编辑器不同的是,它将整个文本分成了一页一页的,当然这也是方便于打印文档. 使用word还是很容易的,一般来说需要注意以下几方面的 ...

  7. Android智能手机中各种音频场景下的audio data path

    上一篇文章(Android智能手机上的音频浅析)说本篇将详细讲解Android智能手机中各种音频场景下的音频数据流向,现在我们就开始.智能手机中音频的主要场景有音频播放.音频录制.语音通信等.不同场景 ...

  8. Linux学习之CentOS(二十)------vi/vim 按键说明

    vi/vim 按键说明 除了上面简易范例的 i, Esc, :wq 之外,其实 vim 还有非常多的按键可以使用. 第一部份:一般模式可用的光标移动.复制粘贴.搜索替换等 移动光标的方法 h 或 向左 ...

  9. ubuntu + 远程桌面连接命令 + rdesktop + 连接windows或者ubuntu远程桌面

    原文 https://www.cnblogs.com/xiaouisme/p/5166469.html sudo apt-get install rdesktop rdesktop 124.42.12 ...

  10. UMAIL安装教程

    UMAIL安装教程 一.UMAIL虚拟机的创建与安装 首先在VM中选择新建虚拟机 选择下一步 选择稍后安装操作系统 选择Linux系统 版本CentOS 7 64位 选择名称与安装位置 选择下一步 选 ...