SQL Server Extended 伊夫nts 进阶 一:从SQL Trace 到Extended 伊夫nts

SQL Server Extended 伊夫nts 进阶 一:从SQL Trace 到Extended 伊夫nts

我们定义追踪全数语句批量操作的追踪,从下边表大家得以查找到为1二,一三

 

参照文书档案:

什么是Extended Event

Extended 伊夫nt 是贰个轩然大波采访基础设备,最早在 SQL Server 二零零六中引进。大家能够使用Extended 伊芙nt 收集分析SQL server
实例和数据库产生的例外种类型的确诊数据。Extended 伊芙nt是SQLOS的一部分,
它由许多模块组成,并在SQL
Server运维时被加载。它提供了大气的风云集用以替换,升高和扩大SQL
Trace中的事件。

当微软决定使用Extened 伊夫nts 替换SQL
Trace时,他们从草图初叶筹划了一整套event收集架构。他的靶子之壹正是惊人的可扩大性,能够遵照要求添加新的event。与此同时微软为SQL
Server引进一文山会海的Feature, 如Avaliability Groups, In-Memory
OLTP和Columnstore indexes,
由此也还要为那些Feature添加了对应的伊夫nt,用以当使用那么些Feature时收集检查判断数据。对于SQL
Server 二零一二及以上版本,接纳Extended 伊芙nt
至关首要,因为新Featrue参预的event只可以在Extened 伊夫nts中找到。

表一中罗列的各重要SQL Server 版本中可用的Extended
伊夫nt事件数量。那几个是总体的风云, 包罗debug 事件, 同样这个本子中, SQL
Trace 唯有1八十个事件。 在SQL Server 2011中,SQL
Trace的具备事件都有一个卓殊的Extended
伊夫nts事件,即使她们并不曾各类对应。
SQL Server Version Number of Events Notes
图片 1

另3个Extended
伊夫nts设计的第三指标是不择手段减小收集数据的震慑,在调查切磋难点时减小系统相当的开发。Extended
event 使用了两种艺术来达到那1对象, 大家接下去进一步斟酌:

伊芙nt最小暗中同意负载——暗中同意景况下每一种事件仅采集最少的事件数据列。假如大家希望尤其收集列,大家务必出示的足够“Actions”到事件中。SQL
Trace的设计中默许会收集大批量的载重数据,可是大家1味忽略了那么些不必要的数据。
强有力的过滤谓词——Extended伊夫nts提供了要命细致的过滤
通过谓词,大家能够只收集那个符合特定条件的风云。大家得以应用谓词来采访特定的轩然大波,如每爆发5回,
大概只收集1些特定的标准化下的风云,如当三个的多少的值(如Duration)比原先的值大。Extended
伊芙nt在事变触发的中期一旦默许负载数据收集完毕就会被过滤,那样能够幸免任何不要求的数量收集进程。
Advanced Tagets—— 与SQL Trance
相似,同时协助In-Memory(Ring_bufer)和文件系统(event_file)作为靶子。
Extended events 提供了根据特定条件聚合数据选取对象。

那就代表,尽管我们设计了针锋绝对较发杂的轩然大波会话,数据出自数据差别的事件,大家假若小心的设计谓词并采纳那个大家必要收集的靶子数据,大家能够极小的代价来观看服务器。
一句话来说,大批量的风云,结合高效的过滤以及二种选项,使得Extended
伊芙nt成为一个遥远超越Trace的轩然大波收集器。

@on 代表事件情形

3、在SQL Server二零一二后续版本的 Microsoft SQL Server
将去除该功用,改用增添事件。

暗中同意追踪记录的数量存款和储蓄在文书中,能够从系统视图
sys.traces查看文件的门道,文件的高低(Size)和文件的翻新方式等音信,追踪文件默许的扩展名是
.trc。

检查Extended 伊芙nt事件会话

与大家解析由Profiler生成的劳动器端Trace脚本一样,大家会由此不相同的段落稳步分析Extended
伊夫nts事件会话是哪些成立的。

图片 2

select * from sys.traces

若果暗中认可追踪被禁止使用,须要重新配置启用暗中同意追踪:

更换Trace到Extended 伊芙nts 事件会话

将曾经存在的Trace文件定义转换为事件会话,小编推荐的方法
使用一个存款和储蓄进程,他的撰稿人是 Jonathan Kehayias。
你能够从(
那一个本子只幸而SQL Server 二零一二及事后版本运营,以为SQL Server
二零一二在先的版本Extended 伊夫nts并不支持全数的Trace事件。

手动转换Trace到Extended 伊芙nts会话

假如是因为1些原因你不能动用上述存款和储蓄进度,微软文书档案介绍了一个手动转换进度:Convert
an Existing SQL Trace Script to an Extended 伊夫nts Session
()

在你的SQL实例中执行以上脚本用于创立那些蕴藏进度。执行那一个蕴藏进程仅必要输入以下参数,如Listing
陆 所示。

EXECUTE sp_SQLskills_ConvertTraceToExtendedEvents 
              @TraceID = 2, 
              @SessionName = 'XE_ReadsFilter_Trace', 
              @PrintOutput = 1, 
              @Execute = 0;

Listing 6: Converting a server-side
trace to use Extended Events

参数@TraceID 是你要更换为Extended event 的Trace
ID。因此,这一个Trace必须存在,无论正在实施与否。在那边TraceID为二(从Listing
5的实施结果中收获)。

实行那些蕴藏进度为ReadsFilter_Trace.trc Trace生成Extended
Event会话DLL脚本,如Listing7所示:

IF EXISTS ( SELECT 1
             FROM   sys.server_event_sessions
             WHERE  name = 'XE_ReadsFilter_Trace' )
    DROP EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER;
GO
 CREATE EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER
 ADD EVENT sqlserver.rpc_completed (
    ACTION ( sqlserver.client_app_name   -- ApplicationName from SQLTrace
    , sqlserver.database_id              -- DatabaseID from SQLTrace
    , sqlserver.server_instance_name     -- ServerName from SQLTrace
    , sqlserver.session_id               -- SPID from SQLTrace
                   -- EndTime implemented by another Action in XE already
                   -- StartTime implemented by another Action in XE already
   )
    WHERE 
   ( logical_reads >= 10000 ) ),
 ADD EVENT sqlserver.sql_statement_completed (
    ACTION ( sqlserver.client_app_name   -- ApplicationName from SQLTrace
    , sqlserver.database_id              -- DatabaseID from SQLTrace
    , sqlserver.server_instance_name     -- ServerName from SQLTrace
    , sqlserver.session_id               -- SPID from SQLTrace
                   -- EndTime implemented by another Action in XE already
                   -- StartTime implemented by another Action in XE already
   )
    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 )
GO

Listing 7: The Extended Events event
session

 

 

二,禁止使用或启用默许追踪

SQL Trace 和Profiler
将不再引进新效用。固然他们为我们领悟,Profiler伴随SQL Server七.0在一99九发行, 今后是时候拥抱Extended 伊芙nt精通她的职能。

@traceid 要修改的跟踪的 ID号

--查看跟踪文件以表显示
select * from ::fn_trace_gettable('F:\SQLTest\.trc',1)

图片 3

点名目的

在充分全体事件后,大家应用ADD TA昂科威GET 来钦命输出指标,SQL
Server将募集的多寡以及有关的Actions写入目的。在Trace中我们能够选择输出至文件,大概试试写入Profiler,即便不被推举。在Extended
伊夫nts我们也有多个对象能够挑选,蕴涵最中央内部存款和储蓄器存储(ring_buffer)和文件系统存款和储蓄(event_file),同时又有个别高等的对象可以提供数据聚合功效。

在这些例子中,大家将运用event_file作为对象,那点与Trace输出至.trc文件类似,然则大家要求在文书中钦点文件扩张名。

/* Extended Events */

ADD TARGET package0.event_file
(
      SET filename = 'C:\temp\XE_ReadsFilter_Trace.xel',
             max_file_size = 5,
             max_rollover_files = 1
)
/* Trace */

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5 

exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error
Listing 13: Specifying the target for the event session

Listing 13: Specifying the target for the event session
同1大家得以设置文件大小,以及我们得以安装创造的滚动跟新文件数量

其次个:表示近期选拔的trace文件路径,依照它我们能够找到任何的跟踪文件,默许是一致目录下

图片 4

Server-wide Configuration Catalog Views
(Transact-SQL).aspx)

Extended 伊芙nts不仅仅是四个用来替换SQL trace
和Profiler的工具。通过1体化那些连串教程, 你会发觉那多少个使用SQL trace
往往会消耗过高代价的确诊,在Extended 伊夫nt 变的现实,
并且此前困难的,甚至不容许的跟踪任务不但变的管事,而且特别简约。

我们知晓在SQL
Server暗许的跟踪文件在实例重启时候,都会化为乌有,所以我们得以透过如下方法化解,保险在每回实例重新启航的时候都会实施该追踪

当运营到一段时间之后,大家直接拷贝下来,找台计算机分析就足以了。

设若暗中同意追踪已经启用,可以重新配置禁止使用暗中认可追踪:

创办事件会话

本子首先包涵了3个IF段落注明,用于检查是还是不是有同名事件会话存在,假若存在则删除它。那样能够免止在创制事件会话时出现谬误。

IF EXISTS ( SELECT  1
            FROM    sys.server_event_sessions
            WHERE   name = 'XE_ReadsFilter_Trace' )
    DROP EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER;
GO

Listing 8: Checking for the existence of
an event session with the same name

那段脚本接着使用CREATE EVENT SESSION
语法创立了2个风云会话(

/* Extended Events */

CREATE EVENT SESSION [XE_ReadsFilter_Trace]
ON SERVER
-- Create a Queue
DECLARE @rc INT
DECLARE @TraceID INT
DECLARE @maxfilesize BIGINT
SET @maxfilesize = 5 

-- Please replace the text
--InsertFileNameHere…etc…

EXEC @rc = sp_trace_create @TraceID OUTPUT, 0, N'InsertFileNameHere',
    @maxfilesize, NULL 
IF ( @rc != 0 )
    GOTO ERROR

 

Listing 9: Create the event session

--开启Default Trace
sp_configure 'show advanced options' , 1 ;
GO
RECONFIGURE;
GO
sp_configure 'default trace enabled' , 1 ;
GO
RECONFIGURE;
GO

--测试是否开启
EXEC sp_configure 'default trace enabled';
GO

--关闭Default Trace
sp_configure 'default trace enabled' , 0 ;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options' , 0 ;
GO
RECONFIGURE;
GO

通过如下命令进行跟踪的关闭

默许追踪是系统内置的,TraceID是一,私下认可是敞开的,能够经过系统布局表
sys.configurations 举行查看,配置项ID(configuration_id)是1568:

添加Event和Actions

接下去,Extended 伊夫nts脚本金和利息用CREATE EVENT SESSION 的 ADD EVENT
子句内定了第三个事件,此处为
rpc.completed事件,并且接下去钦点了事件触发时执行的壹部分额外动作,那几个事例中为搜集额外的多个事件数据列。

/*Extended Events*/
ADD EVENT sqlserver.rpc_completed (
    ACTION (
      sqlserver.client_app_name
    , sqlserver.database_id
    , sqlserver.server_instance_name
    , sqlserver.session_id
           )

 

/* Trace */
-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 10, 10, @on
exec sp_trace_setevent @TraceID, 10, 3,  @on
exec sp_trace_setevent @TraceID, 10, 12, @on
exec sp_trace_setevent @TraceID, 10, 13, @on
exec sp_trace_setevent @TraceID, 10, 14, @on
exec sp_trace_setevent @TraceID, 10, 15, @on
exec sp_trace_setevent @TraceID, 10, 16, @on
exec sp_trace_setevent @TraceID, 10, 18, @on
exec sp_trace_setevent @TraceID, 10, 26, @on

 

Listing 10: Adding actions

此地有几处Extended
伊芙nts和Trace关键的差异点供给提出。第二,注意事件名和Actions中募集的数据列(如:client_app_name,
database_id),他们是文本。我们不须要再查询哪些数字对应的事件依旧数据列!与SQL
Trace比较,书写阅读Extended 伊夫nts脚本变的愈发简明。

附带,注意Extended
伊夫nts脚本中并未点名全部的数据列。事实上,许多数据列被定义为事件的暗许负载被采访。我们举世闻名不必要在剧本中钦赐那一个默许列。可是我们能够使用UI来查看事件的暗许负载由哪些列组成,
大家会在下1阶教程中等教育授。

那是Trace 和Extended 伊芙nts2人命关天的一颦一笑差别。SQL Trace
默许行为是收集全体极大希望卓有成效的列。然后由用户过滤任何不须要的音讯。Extended
伊夫nts
越来越高效,每一个事件有1组由最少的数据列组成的暗中同意负载,在事件出发时总会被私下认可收集。假如我们要求收集别的不再暗中同意负载中的列,咱们供给以Actions格局充分他们。例如,在科雷傲PC:Completed事件中添加的Actions:client_app_name,
database_id, server_instance_name 和session_id,
他们都不属于事件的暗中同意负载。收集这个Actions是可选的。

因为唯有默许负载事件列会被含有在岁月底,因而早先化事件采访的支付绝对较小。Actions数据搜集是在谓词过滤后才发生的,因而收集多量的Actions,只怕高消耗的Actions(如内部存款和储蓄器Dump),都会扩大Extended
伊夫nts会话的花费。因此,审慎的精选额外的数据收集对抓获事件更是关键。大家会在下一阶中详细研商那个主旨。

--设置跟踪状态以停止
exec sp_trace_setstatus @TraceID,0

其壹跟踪通过在sp_trace_create的私下认可@option参数设置为捌来布置的。代码如下:

SQL
Trace

从大家耳熟能详的起初: SQL Trace

从自家的经验讲,学习新东西最不难的方法正是从大家已知的学问开端。上边对于
SQL Trace 和Profiler等那个你已熟习的学识介绍,将作为我们驾驭Extended
伊芙nt工作办法的底子,且并明白它与SQL Trace 和Profiler的比不上。

对此数据库专家,排查SQL查询质量难点是大家平日遭受的标题之壹。以前,大家不乏先例会创设1个Trace用于捕捉与我们存款和储蓄进程或SQL执行有关的事件。大家普通会安装有个别过滤条件,如超越一定数额的Reads,特定的履行时间或者消耗的CPU等。

万般打开Profiler来定义trace是1个方便快速的方法。当大家新建三个trace,也或者是选拔1些已有的模板,连接受SQL
实例,并精选需求的日子。在截图第11中学,大家仅选用了四个事件“卡宴PC:Completed”
和”SQL:StmtCompleted”,并捕捉了同等的数据列。

图片 5

Figure 1: Selecting events and data columns for a trace

当使用Profiler或SQL
Trace时,添加过滤过滤条件总是被引入的。然则与Extended 伊夫nt比,使用SQL
Trace的标题之一正是前期过滤。及时大家定义了过滤条件,SQL Trace or
Profiler
任然会采集事件实例的整整数额,然后再过滤它。当然,过滤条件依旧是那么些关键的,它保障了我们的发送到客户端依然目的文件的事件是通过过滤的。
在那一个事例中,大家添加2个过滤条件:Reads 大于等于一千0,如图2

图片 6

Figure 2: Defining a trace filter on
number of reads

当大家选拔好事件和列,设置过滤,以及保存的Trace
文件后,大家就足以运维Trace了。经验丰裕的DBA和支付都驾驭直接运营Profiler会带来惨重的习性难点(
).由此为了最小化对生育环境的熏陶,最佳的主意是点击起初后迅即停下Trace,然后通过”File
| Export | Script Trace Definition | For SQL Server 二〇〇六 –
2014″菜单导出脚本。 那样做之后Trace将在服务器端执行而不是在
Profiler的GUI上实施。 List 一 是导出的SQL脚本。

/****************************************************/
/* Created by: SQL Server 2014 Profiler          */
/* Date: 11/30/2015  08:50:44 AM         */
/****************************************************/

-- Create a Queue
DECLARE @rc INT
DECLARE @TraceID INT
DECLARE @maxfilesize BIGINT
SET @maxfilesize = 5 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

EXEC @rc = sp_trace_create @TraceID OUTPUT, 0, N'InsertFileNameHere',
    @maxfilesize, NULL 
IF ( @rc != 0 )
    GOTO error

-- Client side File and Table cannot be scripted

-- Set the events
DECLARE @on BIT
SET @on = 1
EXEC sp_trace_setevent @TraceID, 10, 10, @on
EXEC sp_trace_setevent @TraceID, 10, 3, @on
EXEC sp_trace_setevent @TraceID, 10, 12, @on
EXEC sp_trace_setevent @TraceID, 10, 13, @on
EXEC sp_trace_setevent @TraceID, 10, 14, @on
EXEC sp_trace_setevent @TraceID, 10, 15, @on
EXEC sp_trace_setevent @TraceID, 10, 16, @on
EXEC sp_trace_setevent @TraceID, 10, 18, @on
EXEC sp_trace_setevent @TraceID, 10, 26, @on
EXEC sp_trace_setevent @TraceID, 41, 3, @on
EXEC sp_trace_setevent @TraceID, 41, 10, @on
EXEC sp_trace_setevent @TraceID, 41, 12, @on
EXEC sp_trace_setevent @TraceID, 41, 13, @on
EXEC sp_trace_setevent @TraceID, 41, 14, @on
EXEC sp_trace_setevent @TraceID, 41, 15, @on
EXEC sp_trace_setevent @TraceID, 41, 16, @on
EXEC sp_trace_setevent @TraceID, 41, 18, @on
EXEC sp_trace_setevent @TraceID, 41, 26, @on
EXEC sp_trace_setevent @TraceID, 41, 61, @on


-- Set the Filters
DECLARE @intfilter INT
DECLARE @bigintfilter BIGINT

EXEC sp_trace_setfilter @TraceID, 10, 0, 7,
    N'SQL Server Profiler - f45d52c9-c0eb-45da-8bae-dc6f1a945251'
SET @bigintfilter = 10000
EXEC sp_trace_setfilter @TraceID, 16, 0, 4, @bigintfilter

-- Set the trace status to start
EXEC sp_trace_setstatus @TraceID, 1

-- display trace id for future references
SELECT  TraceID = @TraceID
GOTO finish

error: 
SELECT  ErrorCode = @rc

finish: 
go

Listing 1: A server-side trace to capture poorly-performing queries

稍加人从前逐句的阅读过上述SQL Trace
脚本,也说不定只是对上述脚本的效果由自然领悟。
可是为着保障大家在同1块跑线上,大家会相当慢的解释一下那段脚本。

起头的1段定义了壹部分用以创立Trace的储存进度sp_trace_create
所急需的变量。作为二个用户,大家首先定义了最大文件大小(那几个例子中@maxfilesize设置的为伍MB)。大家也能够钦点是不是。越多关于sp_trace_create细节请查看

输出文件路径也是sp_trace_create的一有的。在运行这么些Trace钱,请使用一个相宜的文本路径替换InsertFileNameHere,如“C:\temp\ReadsFilter_Trace”。根据脚本的申明,大家不供给钦命.trc后缀名。

-- Create a Queue
DECLARE @rc INT
DECLARE @TraceID INT
DECLARE @maxfilesize BIGINT
SET @maxfilesize = 5 

-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

EXEC @rc = sp_trace_create @TraceID OUTPUT, 0, N'InsertFileNameHere',
    @maxfilesize, NULL 
IF ( @rc != 0 )
    GOTO error

Listing 2: The sp_trace_create portion
of the server-side trace

依照上述定义,那么些Trace会一向推行,直到大家手动甘休它。可能,我们能够为sp_trace_create提供2个@datetime参数,那样大家就足以界定Trace的实践时间(例如大家能够安装进行一个小时set
@DateTime = dateadd(hh, 一, getdate())。

Trace脚本的下1段设置了我们所急需的事件。存款和储蓄进度sp_trace_setevent添加了我们要求捕获的风浪和列。那几个使用数据来标识的轩然大波和列并不便于阅读。大家常常需求MSDN(
和SQL:StmtCompleted事件。接下来第三列定义了数据列。例如⑩代表ApplicationName,叁代表DatabaseID等。为了更清晰的查看,作者在源代码上添加了诠释。

 

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 10, 10, @on    --RPC:Completed, AppName
exec sp_trace_setevent @TraceID, 10, 3,  @on    --RPC:Completed, DatabaseID
exec sp_trace_setevent @TraceID, 10, 12, @on    --RPC:Completed, SPID
exec sp_trace_setevent @TraceID, 10, 13, @on    --RPC:Completed, Duration
exec sp_trace_setevent @TraceID, 10, 14, @on    --RPC:Completed, StartTime
exec sp_trace_setevent @TraceID, 10, 15, @on    --RPC:Completed, EndTime
exec sp_trace_setevent @TraceID, 10, 16, @on    --RPC:Completed, Reads
exec sp_trace_setevent @TraceID, 10, 18, @on    --RPC:Completed, CPU
exec sp_trace_setevent @TraceID, 10, 26, @on    --RPC:Completed, ServerName
exec sp_trace_setevent @TraceID, 41, 3,  @on    --SQL:StmtCompleted, DatabaseID
exec sp_trace_setevent @TraceID, 41, 10, @on    --SQL:StmtCompleted, AppName
exec sp_trace_setevent @TraceID, 41, 12, @on    --SQL:StmtCompleted, SPID
exec sp_trace_setevent @TraceID, 41, 13, @on    --SQL:StmtCompleted, Duration
exec sp_trace_setevent @TraceID, 41, 14, @on    --SQL:StmtCompleted, StartTime
exec sp_trace_setevent @TraceID, 41, 15, @on    --SQL:StmtCompleted, EndTime
exec sp_trace_setevent @TraceID, 41, 16, @on    --SQL:StmtCompleted, Reads

Listing 3: Setting the trace events

在数据库引擎中,Trace控制器会检查1个事变是还是不是须求被抓走。如若需求则将事件的音信发送到SQL跟踪行集提供程序,大概只要你运营的Profiler,可能是文件。在Trace发送那个音信前,全部不须要的行会被移除。例如在大家定义的多个事件中,大家并没有选拔DatabaseName。不过SQL
server
任然会为那多个时间捕捉DatabaseName列,只是它并不会被发送到GUI只怕封存在文书中。

在最终一步中,大家接纳存款和储蓄进程sp_trace_setfilter为Trace定义了过滤条件。四个过过滤条件“SQL
Server Profiler –
f肆伍d52c9-c0eb-四伍da-八bae-dc6f1a94525壹”是由脚本暗中同意生成的,它过滤了部分由Profiler
UI生成的“admin”查询(SELECT SERAV4VE纳瓦拉PROPE悍马H2TY )。

在那几个例子中,大家设置了1个过滤条件,只将Reads大于等于一千0
(@bigintfilter =
一千0)的查询语句或存储进程发送到目的文件中。再次提醒,这是中期过滤,全部的事件和新闻都会被捕捉。然后在发送到文件或客户端前依据筛选标准移除。

-- Set the Filters
DECLARE @intfilter INT
DECLARE @bigintfilter BIGINT

EXEC sp_trace_setfilter @TraceID, 10, 0, 7,
    N'SQL Server Profiler - f45d52c9-c0eb-45da-8bae-dc6f1a945251'
SET @bigintfilter = 10000
EXEC sp_trace_setfilter @TraceID, 16, 0, 4, @bigintfilter

Listing 4: Setting the trace
filter

本子的最终壹段使用存款和储蓄进度sp_trace_setstatus
运行Trace,并出示TraceID。那些唯一的TraceID用于甘休Trace,也可以用于删除Trace定义。

-- Set the trace status to start
EXEC sp_trace_setstatus @TraceID, 1

-- display trace id for future references
SELECT  TraceID = @TraceID
GOTO finish

error: 
SELECT  ErrorCode = @rc

finish: 
go

Listing 5: Starting the trace

只要大家实施了那几个本子,Trace将被运行并将四处的周转和采集事件数量,直至大家截止它。以往,大家怎么将那一个所掌握的技能,使用Extended
伊夫nt替代呢?

 私下认可的跟踪文件,提供的跟踪新闻依然很全的,从中大家得以找到登录人,操作音信等,上边的截图只是带有的某个新闻。大家得以应用该语句实行和谐的加工,然后拿走更管用的音信。

将我们刚刚的全数操作,已经追踪出来了。

1,查看暗中认可追踪是还是不是启用

安装事件会话选项

末段,在大家的对话定义中,我们还有为数不少可选的对话配置项,如最大内部存款和储蓄器大小以及调度延迟。因为我们在本子中从未点名这一个选拔,因而会利用暗中认可值。会话设置会在下1阶中详细研究。
若果大家再花一分钟回顾一下整个Extended
Events会话定义,你会意识它丰盛直观而且对于这几个DDL每一局地的敞亮不会有别的劳累。

图片 7

下一场,我们应用方面包车型客车死锁脚本,运营获取死锁的捕捉

SQL Server 默许跟踪(Default
Trace)

总结

您以往早就知道怎么着将SQL Trace 的知识映射到Extended
伊夫nts中了,大家得以行使T-SQL达到我们的对象。大家下一步将详细的看一下DDL,
并且转向Extended 伊芙nts的UI。我们在转手阶中消除这么些难点。

 笔者创立了一张表,通过上边的跟踪,可以跟踪到该记录的消息,依据差异的过滤音信,我们能够查询出到跟踪的有个别库的某部表的变更音信,包罗:肆陆创办(Created)、47刨除(Deleted)、玖3文书自动拉长音信(Log
File Auto Grow)、1四陆改动(Alter)、20意味错误日志(Login Failed)

--设置跟踪状态以停止
exec sp_trace_setstatus @TraceID,0

7,查看事件绑定的字段

这些体系教程中,大家将详细的牵线怎样使用Extended
伊夫nts作为会诊数据搜集工具,用来跟踪SQL
Server的性质难点。第3节中我们将从三个DBA都锁熟识的难点开端: 使用SQL
trace 跟踪考察 long-rannning 查询。 从基础起始,小编会介绍怎么样使用Extended
伊夫nts 实现同样的职务。

以上代码参照院子里大腕宋沄剑,那里大家应用系列的自带的profile举行统一筹划追踪,大家间接选用系统自带的死锁模板,举办追踪

select * from ::fn_trace_getinfo(0)

SQL
Server中有关跟踪(Trace)那点事

SQL server 二零一零 中引进了Extended 伊芙nts 用以交流SQL Trace。
可是在首先个版本中并未为用户提供UI,由此使用Extended
伊芙nts并不是很有益。SQL Server
2013及时考订了那一点,将UI管理工具集成在SSMS中,
那就象征大家不供给再为了查询伊夫nt
XML而读书应用XQuery了。因而跟多的DBA和支付由SQL trace
和Profiler转向了Extended 伊芙nts.

 

因此如下存款和储蓄进度,将大家自定的寻踪运营

在创设SQL Trace之后,点击File->Export->Scipt Trace
Definition,把SQL Server Profiler用于成立SQL Trace的剧本代码导出:

 

小编们透过以下命令来查看跟踪文件中的内容:

exec sp_configure 'show advanced options' , 1 ;
go
reconfigure;
go

exec sp_configure 'default trace enabled' , 1 ;
go
reconfigure;
go

运维事件会话

与Trace1样,Extended
Event会话不会被默许运转。为了运营二个对话,大家须求采用Listing
第11四中学所示的ALE索罗德T语句。

ALTER EVENT SESSION [XE_ReadsFilter_Trace]
 ON SERVER
 STATE=START;
GO

Listing 14: Starting the event
session

履行运行后,大家得以运作一段脚本来验证Extended 伊芙nts是不是曾经起步。

/* Extended Events */

SELECT
  [es].[name] AS [EventSession],
 [xe].[create_time] AS [SessionCreateTime],
  [xe].[total_buffer_size] AS [TotalBufferSize],
  [xe].[dropped_event_count] AS [DroppedEventCount]
FROM [sys].[server_event_sessions] [es]
LEFT OUTER JOIN [sys].[dm_xe_sessions] [xe] ON [es].[name] = [xe].[name];
GO
/* Trace */

SELECT 
  [id] AS [TraceID],
  CASE
    WHEN [status] = 0 THEN 'Not running'
    WHEN [status] = 1 THEN 'Running'
  END AS [TraceStatus],
  [start_time] AS [TraceStartTime],
  [buffer_size] AS [BufferSize],
  [dropped_event_count] AS [DroppedEventCount]
FROM [sys].[traces];
GO

Listing 15: Check to see which event sessions and traces are running

在那几个例子里,大家得以阅览Figure
三中的输出,他们出示了我们所创办的用户事件会话和Trace,同样,事件会话和Trace已经被运转了。

就像是Trace由一个私下认可直至执行的Trace(TraceID =壹), Extended
伊夫tns也有system_health
事件会话,那一个与私下认可Trace并不完全一样。我们在下阶中再看system_health
会话。借使你选择了Availability Groups (AG),也会有2个AlwaysOn_health
会话一贯推行,来收集AG相关的消息以及故障检查评定事件。

图片 8

Figure 3: Which traces and event sessions are running?

在我们运转了Trace和Session后,大家得以动用ALTERubiconSESSION来终止事件会话,使用sp_trace_setstatus停止Trace。

/* Extended Events */

ALTER EVENT SESSION [XE_ReadsFilter_Trace]
  ON SERVER
  STATE=STOP;
GO
/* Trace */

DECLARE @TraceID INT = 2;
EXEC sp_trace_setstatus @TraceID, 0; 
GO

Listing 16: Stopping the extended events session and trace

那时候,没有数据被采集,不过我们定义的Trace和事件会话都还在,我们得以依照须要再次运维他们,恐怕将她们的概念完全除去。

/* Extended Events */

DROP EVENT SESSION [XE_ReadsFilter_Trace]
    ON SERVER;
GO
/* Trace */

DECLARE @TraceID INT = 2;
EXEC sp_trace_setstatus @TraceID, 2; 
GO

Listing 17: Removing the extended events session and trace definition

小编们并不引进在事变会话完毕后将它删除。恐怕很多少人有在运用Trace时有那个习惯,在Trace中当SQL实例被重启后,除了私下认可Trace别的Trace定义会整整不翼而飞。这一个也是Extended
伊夫nts与Trace首要的分裂点:会话定义会作为元数据保存在服务器中,并且会被持久化。创造过事件会话后,你就足以根据必要运营或截止它了。

那种方法接近不错,可是它也有自身的通病,大家来看:

能够看出,大家已经胜利的寻踪到那一个死锁。大家掌握这种追踪是高资金的,并且大家偶尔不掌握死锁发生的具体时刻,所以无法直接开着这么些Profile,出于质量思考也不建议如此做,所以大家采纳新建的Trace文件,来保存改脚本,然后重定向到咱们和好的公文夹,将死锁的音讯放置到该文件夹下,提供更加大灵活性。

参数number_files:如果number_files 被钦命为default,函数读取全体的轮转文件。

添加别的事件

此时rpc_completed 事件早已安顿完毕。添加别的的风浪仅需选择ADD
EVENT子句再次添加,如Listing1二所示的丰裕sql:statement_completed事件。

ADD EVENT sqlserver.sql_statement_completed(
   ACTION 
   (
           sqlserver.client_app_name         -- ApplicationName from SQLTrace
          , sqlserver.database_id            -- DatabaseID from SQLTrace
          , sqlserver.server_instance_name   -- ServerName from SQLTrace
          , sqlserver.session_id             -- SPID from SQLTrace
                   -- EndTime implemented by another Action in XE already
                   -- StartTime implemented by another Action in XE already
   )
   WHERE 
   (
           logical_reads >= 10000
   )

Listing 12: Adding a second event to the
event session

双重,大家得以接纳额外的数据列。Extended
伊夫nts的灵活性在于咱们能够为各样事件设置同1也许区别的过滤条件。那一点在Trace中不能够完毕,过滤条件对于具有事件生效。此外在Extended
伊夫nts中大家得以设置越多强大的过滤条件,如大家能够利用AND和O宝马X3条件,在此咱们不做过多研讨。

 

不难易行的举几个使用场景:

图片 9图片 10

定义predicate

在增选过事件和额外的Actions后,接下的一段定义了过滤器。

/* Extended Events */
    WHERE 
     ( logical_reads >= 10000 )
/* Trace */

-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - f45d52c9-c0eb-45da-8bae-dc6f1a945251'
set @bigintfilter = 10000
exec sp_trace_setfilter @TraceID, 16, 0, 4, @bigintfilter

 

Listing 11: Adding a filter

回想下当我们采纳Profiler定义trace时,大家运用了Sp_trace_setfilter设置了三个过滤,排除拥有小于一千0Reads的轩然大波数量。在事件会话定义中,这么些过滤,术语为谓词,是2个简单易行的WHERE子句。

Extended
伊芙nts执行早期过滤。换句话说,在事变基础数据搜集后里立时执行谓词,只有切合过滤条件的风波实例才会被触发。这种工作机制与SQL
Trace和Profiler的末期过滤比较,在多少收集时的支出更加小。

将该脚本保存到三个地点,然后大家打开,小编顺手将暗中同意的文本路径添加上

譬如我们得以行使如下脚本进行创办 

select id
    ,iif(status=1,'running','stopped') as status
    ,path
    ,max_size
    ,start_time
    ,stop_time
    ,event_count
    ,max_files
    ,is_rowset
    ,is_rollover
    ,is_shutdown
    ,is_default
    ,buffer_count
    ,buffer_size as each_buffer_size
from sys.traces
where id=1

由此如下命令进行跟踪的删除

--从系统中移除跟踪
exec sp_trace_setstatus @TraceID,2
exec sp_configure 'default trace enabled' , 0 ;
go
reconfigure;
go

exec sp_configure 'show advanced options' , 0 ;
go
reconfigure;
go

 

壹提到跟踪俩字,很多个人想到警察匪徒片中的场景,同样在我们的SQL
Server数据库中“跟踪”也是无处不在的,要是大家使用好了跟踪技术,就足以本着1些特定的情景做定向分析,找出丰富的凭据来破案。

八,使用SQL Server Profiler创建SQL Trace

图片 11

图片 12

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
set @maxfilesize = 5

-- Client side File and Table cannot be scripted
exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
if (@rc != 0) goto error

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 14, 1, @on
exec sp_trace_setevent @TraceID, 14, 9, @on

--delete many commands here ---

-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint
exec sp_trace_setfilter @TraceID, 1, 0, 6, N'%drop%'

-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go

找到该目录,大家查阅下该文件:

转载

 

然后,我们接纳方面包车型大巴死锁脚本,运行获取死锁的捕捉

/****************************************************/
/* Created by: SQL Server 2008 Profiler             */
/* Date: 2014/11/23  20:28:11         */
/****************************************************/


-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint
--可以更改文件大小
set @maxfilesize = 5 

--默认死锁文件放置目录
declare @FilePath nvarchar(max)
set @FilePath=N'F:\SQLTest\DeadLock.trc'
-- Please replace the text InsertFileNameHere, with an appropriate
-- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
-- will be appended to the filename automatically. If you are writing from
-- remote server to local drive, please use UNC path and make sure server has
-- write access to your network share

exec @rc = sp_trace_create @TraceID output, 0, @FilePath, @maxfilesize, NULL 
if (@rc != 0) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit
set @on = 1
exec sp_trace_setevent @TraceID, 137, 15, @on
exec sp_trace_setevent @TraceID, 137, 32, @on
exec sp_trace_setevent @TraceID, 137, 1, @on
exec sp_trace_setevent @TraceID, 137, 13, @on
exec sp_trace_setevent @TraceID, 137, 22, @on
exec sp_trace_setevent @TraceID, 148, 11, @on
exec sp_trace_setevent @TraceID, 148, 12, @on
exec sp_trace_setevent @TraceID, 148, 14, @on
exec sp_trace_setevent @TraceID, 148, 1, @on
exec sp_trace_setevent @TraceID, 26, 15, @on
exec sp_trace_setevent @TraceID, 26, 32, @on
exec sp_trace_setevent @TraceID, 26, 1, @on
exec sp_trace_setevent @TraceID, 26, 9, @on
exec sp_trace_setevent @TraceID, 26, 57, @on
exec sp_trace_setevent @TraceID, 26, 2, @on
exec sp_trace_setevent @TraceID, 26, 10, @on
exec sp_trace_setevent @TraceID, 26, 11, @on
exec sp_trace_setevent @TraceID, 26, 35, @on
exec sp_trace_setevent @TraceID, 26, 12, @on
exec sp_trace_setevent @TraceID, 26, 13, @on
exec sp_trace_setevent @TraceID, 26, 6, @on
exec sp_trace_setevent @TraceID, 26, 14, @on
exec sp_trace_setevent @TraceID, 26, 22, @on
exec sp_trace_setevent @TraceID, 25, 15, @on
exec sp_trace_setevent @TraceID, 25, 32, @on
exec sp_trace_setevent @TraceID, 25, 1, @on
exec sp_trace_setevent @TraceID, 25, 9, @on
exec sp_trace_setevent @TraceID, 25, 57, @on
exec sp_trace_setevent @TraceID, 25, 2, @on
exec sp_trace_setevent @TraceID, 25, 10, @on
exec sp_trace_setevent @TraceID, 25, 11, @on
exec sp_trace_setevent @TraceID, 25, 35, @on
exec sp_trace_setevent @TraceID, 25, 12, @on
exec sp_trace_setevent @TraceID, 25, 13, @on
exec sp_trace_setevent @TraceID, 25, 6, @on
exec sp_trace_setevent @TraceID, 25, 14, @on
exec sp_trace_setevent @TraceID, 25, 22, @on
exec sp_trace_setevent @TraceID, 59, 32, @on
exec sp_trace_setevent @TraceID, 59, 1, @on
exec sp_trace_setevent @TraceID, 59, 57, @on
exec sp_trace_setevent @TraceID, 59, 2, @on
exec sp_trace_setevent @TraceID, 59, 14, @on
exec sp_trace_setevent @TraceID, 59, 22, @on
exec sp_trace_setevent @TraceID, 59, 35, @on
exec sp_trace_setevent @TraceID, 59, 12, @on
exec sp_trace_setevent @TraceID, 60, 32, @on
exec sp_trace_setevent @TraceID, 60, 9, @on
exec sp_trace_setevent @TraceID, 60, 57, @on
exec sp_trace_setevent @TraceID, 60, 10, @on
exec sp_trace_setevent @TraceID, 60, 11, @on
exec sp_trace_setevent @TraceID, 60, 35, @on
exec sp_trace_setevent @TraceID, 60, 12, @on
exec sp_trace_setevent @TraceID, 60, 6, @on
exec sp_trace_setevent @TraceID, 60, 14, @on
exec sp_trace_setevent @TraceID, 60, 22, @on
exec sp_trace_setevent @TraceID, 189, 15, @on
exec sp_trace_setevent @TraceID, 189, 32, @on
exec sp_trace_setevent @TraceID, 189, 1, @on
exec sp_trace_setevent @TraceID, 189, 9, @on
exec sp_trace_setevent @TraceID, 189, 57, @on
exec sp_trace_setevent @TraceID, 189, 2, @on
exec sp_trace_setevent @TraceID, 189, 10, @on
exec sp_trace_setevent @TraceID, 189, 11, @on
exec sp_trace_setevent @TraceID, 189, 35, @on
exec sp_trace_setevent @TraceID, 189, 12, @on
exec sp_trace_setevent @TraceID, 189, 13, @on
exec sp_trace_setevent @TraceID, 189, 6, @on
exec sp_trace_setevent @TraceID, 189, 14, @on
exec sp_trace_setevent @TraceID, 189, 22, @on
exec sp_trace_setevent @TraceID, 45, 16, @on
exec sp_trace_setevent @TraceID, 45, 1, @on
exec sp_trace_setevent @TraceID, 45, 9, @on
exec sp_trace_setevent @TraceID, 45, 17, @on
exec sp_trace_setevent @TraceID, 45, 10, @on
exec sp_trace_setevent @TraceID, 45, 18, @on
exec sp_trace_setevent @TraceID, 45, 11, @on
exec sp_trace_setevent @TraceID, 45, 35, @on
exec sp_trace_setevent @TraceID, 45, 12, @on
exec sp_trace_setevent @TraceID, 45, 13, @on
exec sp_trace_setevent @TraceID, 45, 6, @on
exec sp_trace_setevent @TraceID, 45, 14, @on
exec sp_trace_setevent @TraceID, 45, 22, @on
exec sp_trace_setevent @TraceID, 45, 15, @on
exec sp_trace_setevent @TraceID, 44, 1, @on
exec sp_trace_setevent @TraceID, 44, 9, @on
exec sp_trace_setevent @TraceID, 44, 10, @on
exec sp_trace_setevent @TraceID, 44, 11, @on
exec sp_trace_setevent @TraceID, 44, 35, @on
exec sp_trace_setevent @TraceID, 44, 12, @on
exec sp_trace_setevent @TraceID, 44, 6, @on
exec sp_trace_setevent @TraceID, 44, 14, @on
exec sp_trace_setevent @TraceID, 44, 22, @on
exec sp_trace_setevent @TraceID, 41, 15, @on
exec sp_trace_setevent @TraceID, 41, 16, @on
exec sp_trace_setevent @TraceID, 41, 1, @on
exec sp_trace_setevent @TraceID, 41, 9, @on
exec sp_trace_setevent @TraceID, 41, 17, @on
exec sp_trace_setevent @TraceID, 41, 10, @on
exec sp_trace_setevent @TraceID, 41, 18, @on
exec sp_trace_setevent @TraceID, 41, 11, @on
exec sp_trace_setevent @TraceID, 41, 35, @on
exec sp_trace_setevent @TraceID, 41, 12, @on
exec sp_trace_setevent @TraceID, 41, 13, @on
exec sp_trace_setevent @TraceID, 41, 6, @on
exec sp_trace_setevent @TraceID, 41, 14, @on
exec sp_trace_setevent @TraceID, 40, 1, @on
exec sp_trace_setevent @TraceID, 40, 9, @on
exec sp_trace_setevent @TraceID, 40, 6, @on
exec sp_trace_setevent @TraceID, 40, 10, @on
exec sp_trace_setevent @TraceID, 40, 14, @on
exec sp_trace_setevent @TraceID, 40, 11, @on
exec sp_trace_setevent @TraceID, 40, 35, @on
exec sp_trace_setevent @TraceID, 40, 12, @on


-- Set the Filters
declare @intfilter int
declare @bigintfilter bigint

exec sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL Server Profiler - efbc9d24-69cd-465f-8daf-e38493da0332'
-- Set the trace status to start
exec sp_trace_setstatus @TraceID, 1

-- display trace id for future references
select TraceID=@TraceID
goto finish

error: 
select ErrorCode=@rc

finish: 
go
select te.trace_event_id as event_id, 
    te.name as event_name,
    tc.trace_column_id as column_id,
    tc.name as column_name,
    tc.type_name as column_type
from sys.trace_event_bindings teb 
inner join sys.trace_columns tc 
    on teb.trace_column_id=tc.trace_column_id
inner join sys.trace_events te 
    on teb.trace_event_id=te.trace_event_id
order by event_id,column_id

其八个:表示滚动文件的深浅(单位MB),当到达那几个值就会成立新的滚动文件

 小编成立了一张表,通过下面的跟踪,能够跟踪到该记录的消息,依据分化的过滤消息,大家能够查询出到跟踪的某些库的有个别表的转移音讯,包含:四六开立(Created)、47刨除(Deleted)、九三文件自动拉长消息(Log
File Auto Grow)、1四陆改动(Alter)、20象征错误日志(Login Failed)

select categ.name as category,
    te.trace_event_id as event_id, 
    te.name as event_name,
    tc.trace_column_id as event_column_id,
    tc.name as column_name,
    tc.type_name as column_type
from sys.fn_trace_geteventinfo(1) as gei
inner join sys.trace_columns tc 
    on gei.columnid=tc.trace_column_id
inner join sys.trace_events te 
    on gei.eventid=te.trace_event_id
inner join sys.trace_categories categ
    on te.category_id=categ.category_id
order by category,event_id,event_column_id

图片 13

--开启Default Trace
sp_configure 'show advanced options' , 1 ;
GO
RECONFIGURE;
GO
sp_configure 'default trace enabled' , 1 ;
GO
RECONFIGURE;
GO

--测试是否开启
EXEC sp_configure 'default trace enabled';
GO

--关闭Default Trace
sp_configure 'default trace enabled' , 0 ;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options' , 0 ;
GO
RECONFIGURE;
GO

暗中同意追踪有七个跟踪文件,每三个文本的最大size暗许是20MB,SQL
Server负责维护这多少个文件,当实例重启的时候还是到Dawen件Size最大值的时候,SQL
Server创设新的文书,将最早成立的跟踪文件删除,依次滚动(Rollover)更新。

接下来设置,私下认可的SPID为超过等于50,小于50的为系统自有事件

第多少个:跟踪的停止时间,那里为Null,表示尚未稳定的终止时间

字段 value=1,表示Default Trace是翻开的。

那几个图像化的工具就相比熟习了,直接打开实行筛选就足以了。

图片 14

3,查看私下认可追踪的音讯

                  8制定服务器发生的末段5MB的跟踪消息记录由服务器保存。

由此上面的剧本,大家已经创办了1个新的跟踪(trace),不过那个跟踪状态为0,也便是说还尚无运营,上面大家的手续就是要为那么些跟踪添加事件(event)

 

透过如下存款和储蓄进程,将大家自定的寻踪运转

create  proc [dbo].[Performance_Trace_StopAll]  
AS   
declare traceCursor cursor for 
select id from sys.traces where id <> 1   
open traceCursor   
    declare @curid int   
    fetch next from traceCursor 
    into @curid   
    while(@@fetch_status=0)  
    begin          
        exec  sp_trace_setstatus @curid,0  
        exec  sp_trace_setstatus @curid,2   
        fetch next from traceCursor into @curid   
    end   
close traceCursor   
deallocate traceCursor 

五,查看暗许追踪记录的轩然大波列表

图片 15

那里大家来使用协调新建跟踪来跟踪1个死锁的发生经过,并且将其记录到我们的Trace文件中,那里我们来营造3个死锁

Category用于集体事件(伊夫nt),是事件的分组,在SQL Server
2011中,共有二三个Category,17八个伊夫nt,每一种伊夫nt属于唯1的1个Category。

@tracefile 跟踪文件的门道,这里能够是share的门道

将该脚本保存到二个职分,然后大家开辟,笔者顺便将暗中认可的文件路径添加上

参数filename:用于钦赐追踪文件的称呼,其值能够从系统视图sys.traces
中的path获取;

sp_trace_create [ @traceid = ] trace_id OUTPUT 
          , [ @options = ] option_value  
          , [ @tracefile = ] 'trace_file' 
     [ , [ @maxfilesize = ] max_file_size ]
     [ , [ @stoptime = ] 'stop_time' ]
     [ , [ @filecount = ] 'max_rollover_files' ]

                  贰代表当文件写满的时候,关闭当前跟踪并创建新文件。

SQL追踪(SQL
Trace)是3个轻量级的寻踪工具,遵照事件(伊夫nts)记录数据库产生的消息,大致对数据库质量未有啥样震慑。SQL
Server内置2个Trace,称作私下认可追踪(Default
Trace),私下认可追踪的ID是壹,大家平日选用的SQL Server Profiler,就是使用SQL
Trace记录数据库活动的1个工具。SQL Trace在SQL
Server数据库引擎种出现的可比早,能够被品质和意义更独立的恢宏事件(Extended
伊夫nts)取代。

一提到跟踪俩字,很多个人想到警匪片中的场景,同样在大家的SQL
Server数据库中“跟踪”也是无处不在的,假如大家使用好了跟踪技术,就足以本着1些特定的场合做定向分析,找出充分的凭据来破案。

系统暗中同意提供多少个跟踪文件,并且每2个文本暗许大小都以20MB,SQL
Server会自个儿维护那七个文件,当实例重启的时候依旧到达最大值的时候,之后会另行生成新的文书,将最早的跟踪文件删除,依次滚动更新。

select * 
from sys.fn_trace_gettable(N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Log\log_4.trc',default)

能够看看,大家曾经胜利的寻踪到这几个死锁。大家知晓那种追踪是高资金的,并且我们偶尔不清楚死锁发生的实际时刻,所以不能够直接开着这几个Profile,出于质量牵记也不建议如此做,所以大家使用新建的Trace文件,来保存改脚本,然后重定向到我们本身的文件夹,将死锁的音讯放置到该文件夹下,提供越来越大灵活性。

--新建追踪的存储过程
use master
go
create proc StartBlackBoxTrace
as
begin
    --默认开启追踪所有的SQL 执行语句,文件文件路径为默认
    DECLARE @TraceID int
    DECLARE @MaxFileSize bigint
    SET @MaxFileSize=25
    EXEC SP_TRACE_CREATE
    @TraceID OUTPUT,
    8,
    NULL,
    @MaxFileSize
    EXEC SP_TRACE_SETSTATUS @TraceID,1
END

--将该存储过程设置为SQL Server服务启动时自动启动
EXEC sp_procoption
'StartBlackBoxTrace','STARTUP','ON'
GO

函数重返的是关联表,有效字段是:追踪关联的轩然大波绑定的字段,

三.死锁案例(201四年5月贰二七日晚补充)

如上命令归来的结果值,各样值(property)代表的含义如下:

函数fn_trace_geteventinfo(trace_id)再次来到追踪关联的轩然大波列表,使用该函数能够查阅私下认可追踪记录的风浪和事件的一定字段:

那里面最常用的就是:

行使如下系统存款和储蓄进程,大家能够成立自定义的Trace

在SQL Server
二零一三中,事件共有陆拾陆个字段,但不是各个伊夫nt都能绑定全部的6十七个字段,每一种伊芙nt能够绑定的字段是一贯的,系统预先安装,用户不能够改改,视图 sys.trace_event_bindings 用于体现各样事件绑定的字段。

SQL
Server本人自带的Profile工具就提供编辑脚本的效益,我们将地点的计划性,导出成Trace脚本,大家点击“文件”,导出该布置脚本

图片 16

4,查看追踪文件的内容

 

图片 17

sys.fn_trace_gettable ( 'filename' , number_files )

黑匣子作为飞机出现事故后的追踪利器,在微软的SQL
Server那一个数据库中私下认可也给装上了此引擎,不过并未有拉开,此成效大概辅助大家检查判断间歇性的服务器崩溃。它比大家地点介绍的暗许开启的跟踪盯梢的音讯更全,跟踪越来越大一些。其剧情涵盖了:“SP:运行”、“SQL:批处理运转”、非凡和留心等事件

 

select tc.name as category,
    te.trace_event_id as event_id,
    te.name as event_name
from sys.trace_categories tc 
inner join sys.trace_events te 
    on tc.category_id=te.category_id
order by category,event_id

图片 18

使用SQL Trace来完毕SQL
Server的跟踪操作

注:SQL
Trace是被扩张事件代表的职能,在三番5回的版本中校会被移除,提出在此后的开发中动用扩张事件。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图