原文:https://blog.csdn.net/kk185800961/article/details/49252037

分享个SQLServer profiler 的一个技巧吧。很早用过,忘记总结了,现在再用时记录下来。

当启用 SQLServer profiler 跟踪sql语句的时候,是非常方便的,同时也可以按照各个维度筛选跟踪。但是对于长时间跟踪,一直打开着profiler界面不是很好。

有一个技巧是可以把profiler 的跟踪设置导出成sql 脚本,脚本可以在后台执行。以跟踪慢查询为例

【堵塞跟踪】

1. 首先打开profiler 跟踪堵塞语句,事件选择 Blocked process report ,再把其他的事件都去掉。

2. 分别执行以下语句,模拟堵塞情况。

--[查询窗口1],更新一行记录,等待20秒钟
BEGIN TRAN
UPDATE dbo.AAA SET Title='KK'
WAITFOR DELAY '00:00:20'
COMMIT TRAN

--同时再打开[查询窗口2],更新同一行记录(将被堵塞)UPDATE dbo.AAA SET Title='KK'

3. 几秒钟后,profiler 捕获到了堵塞信息。

4. 查看XML格式的堵塞信息。<blocked-process> 块是被堵塞的信息,<blocking-process> 为堵塞其他进程的信息。

<blocked-process-report>
<blocked-process>
" logused" waitresource: (f2008a1296d8)"
waittime" ownerId" transactionname:36.753"
XDES" kpid" status" sbid" ecid"
priority" trancount" lastbatchstarted::12.240"
clientapp" loginname="kk\Administrator"
isolationlevel)" xactid" currentdb" lockTimeout" clientoption1" clientoption2">

<executionStack>
" stmtstart" sqlhandle="0x020000005733991f90e1d1e1f620bc49ef0224e73cc0dc81"/>
" sqlhandle="0x020000008d15b82d9936449bac7b1e417abd9ca11e87c9b3"/>
</executionStack>
<inputbuf>
UPDATE dbo.AAA SET Title='KK' </inputbuf>
</process>
</blocked-process>
<blocking-process>
" spid" sbid" ecid" priority" trancount"
lastbatchstarted:::32.157"
clientapp" loginname="kk\Administrator"
isolationlevel)" xactid" currentdb" lockTimeout" clientoption1" clientoption2">

<executionStack>
" stmtstart" stmtend" sqlhandle="0x020000006a0d703b95612db79d614f608d92db0ec58bcfb3"/>
</executionStack>
<inputbuf>
BEGIN TRAN
UPDATE dbo.AAA SET Title='KK'
WAITFOR DELAY '00:00:20'
COMMIT TRAN </inputbuf>
</process>
</blocking-process>
</blocked-process-report>

但是这样跟踪的确不方便,可以试试以下这种方法。

1. 在当前 profiler 设置中导出SQL 脚本

2. 更改了创建跟踪(sp_trace_create)一些跟踪信息。最终脚本如下

-- Create a Queue
declare @rc int
declare @traceid int    --跟踪分配的编号
declare @options int    --TRACE_FILE_ROLLOVER=2/SHUTDOWN_ON_ERROR=4/TRACE_PRODUCE_BLACKBOX=8
)--跟踪文件的存储路径
declare @maxfilesize bigint    --跟踪文件的大小,单位是mb,默认5mb
declare @endtime datetime    --停止跟踪的日期和时间,为NULL则表示一直跟踪
declare @filecount int    --跟踪文件的数量,其值大于1,TRACE_FILE_ROLLOVER=2 时有效

set @tracefile = N'E:\BlockedTraceResult\BlockedTraceName'

,GETDATE())

-- exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL
exec @rc = sp_trace_Create @TraceID output,@options,@tracefile,@maxfilesize,@endtime,@filecount
) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit

, , @on
, , @on
, , @on
, , @on
, , @on

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

-- Set the trace status to start

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

error:
select ErrorCode=@rc

finish:
go

3. 执行上面的脚本,跟踪即可在后台运行,跟踪记录记录在文件中。

4. 要查看跟踪内容,可以双击跟踪文件以 profiler 打开查看。或者可以用sql 语句查看其跟踪设置和跟踪记录内容。

select * from sys.traces
)
select * from ::fn_trace_gettable('E:\BlockedTraceResult\BlockedTraceName.trc',default)
select ServerName,EventClass,StartTime,TextData,CONVERT(XML,TextData) XMLTextData
from ::fn_trace_gettable('E:\BlockedTraceResult\BlockedTraceName.trc',default)

5. 停止、启用和删除跟踪

select id,status from sys.traces
-- exec sp_trace_setstatus id,num
,    --停止跟踪
,    --启动跟踪
,    --删除跟踪

6. 堵塞时间设置(多少秒才算是堵塞)

-- 查看堵塞时间(单位:秒)
exec sp_configure N'blocked process threshold (s)'

-- 设置堵塞时间

reconfigure

注意:

这里跟踪的只是堵塞,如果一个语句执行30秒,虽然执行时间较长,但是没有堵塞其他语句,也是跟踪不到的。所以有的慢查询是会漏掉的。

如果设置5秒捕获堵塞,同一个查询如果堵塞了10秒,将会跟踪到2次相同的信息,也就是每5秒捕获一次。

【慢查询跟踪】

【慢查询GUI实现】

(1)新建模板

    

(2)修改事件,跟踪执行时间超过3秒的SQL和SP

  同样步骤,跟踪慢查询只要 跟踪存储过程或者TSQL的完成情况,如下图所示,跟踪 RPC:Complited 和 SQL:BacthComplited ,只有跟踪 Complited 才有时间字段,starting 是没有时间的,所以starting 没必要跟踪了。

    

(3)测试

BEGIN TRAN
) * FROM db_tank..sys_users_detail
WAITFOR DELAY '00:00:05'
ROLLBACK TRAN

获得了正确的跟踪捕获

    

(4)导出跟踪成SQL脚本

  

/****************************************************/
/* Created by: SQL Server Profiler 2005             */
/* Date: 2019/10/15  10:55:19         */
/****************************************************/

-- Create a Queue
declare @rc int
declare @TraceID int
declare @maxfilesize bigint

-- 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
--这里一定要修改下面的文件保存路径
, N'd:\dba_tools\slow_query1', @maxfilesize, NULL
) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit

, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on

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

, , , N'SQL Server Profiler - ebdab0ad-8e05-468b-bead-4f62c9899565'

, , , @bigintfilter

-- Set the trace status to start

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

error:
select ErrorCode=@rc

finish:
go

---------------- 测试跟踪

-- 测试跟踪,设置事务执行大于3秒钟:
BEGIN TRAN
SELECT top(10) * FROM db_tank..sys_users_detail
WAITFOR DELAY '00:00:05'
ROLLBACK TRAN
-- 查看
select ServerName,EventClass,StartTime,TextData,CONVERT(XML,TextData) XMLTextDatafrom ::fn_trace_gettable('d:\dba_tools\slow_query1.trc',default)    

    

select * from fn_trace_gettable('d:\dba_tools\slow_query1.trc',default)    

    

自定义修改

declare @rc int
declare @traceid int    --跟踪分配的编号
declare @options int    --TRACE_FILE_ROLLOVER=2/SHUTDOWN_ON_ERROR=4/TRACE_PRODUCE_BLACKBOX=8
)--跟踪文件的存储路径
declare @maxfilesize bigint    --跟踪文件的大小,单位是mb,默认5mb
declare @endtime datetime    --停止跟踪的日期和时间,为NULL则表示一直跟踪
declare @filecount int    --跟踪文件的数量,其值大于1,TRACE_FILE_ROLLOVER=2 时有效

set @tracefile = N'E:\SlowQueryTraceResult\SlowTraceName'

set @endtime = NULL --无结束时间

exec @rc = sp_trace_Create @TraceID output,@options,@tracefile,@maxfilesize,@endtime,@filecount
) goto error

-- Client side File and Table cannot be scripted

-- Set the events
declare @on bit

, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on
, , @on

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

, , , @bigintfilter

-- Set the trace status to start

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

error:
select ErrorCode=@rc

finish:
go

如何查看跟踪?select * from master.sys.traces
跟踪结果:select ServerName,EventClass,StartTime,TextData,CONVERT(XML,TextData) XMLTextDatafrom ::fn_trace_gettable('E:\SlowQueryTraceResult\SlowTraceName.trc',default)
 

注意:

与堵塞一样,如果一条语句可能执行不到1秒钟,但是资源被其他进程占用了,导致这条语句等待了10秒,这条语句也同样被输出。

跟踪的语句只有执行完成才能跟踪到,正在执行的语句是无法跟踪到的。

对于当前正在执行的,可以用系统 DMV 视图查看,如 master.dbo.sysprocesses 或者 sys.dm_exec_requests 等。

【监控实践】【4.1】利用trace实现阻塞跟踪和慢查询跟踪的更多相关文章

  1. Kubernetes监控实践

    一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...

  2. 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu

    本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...

  3. Windows性能计数器监控实践

    Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集.分析系统内的应用程序.服务.驱动程序等的性能数据,以此来分析系统的瓶颈.监控组件的表 ...

  4. 利用百度API Store接口进行火车票查询

    火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...

  5. Windows应用程序进程级别统一监控实践

    一般的系统级别指标监控,更多关注CPU.内存.磁盘.网络等运行情况,对应用程序运行时的进程指标关注不够,导致不能深入了解系统运行状态.本文根据笔者应用实践,探讨一下进程级别监控涉及到的监控内容以及监控 ...

  6. 从 IT 中断中学到的最佳监控实践

    每个运维监控工具,一般要追踪数十万个内部性能指标.学会对哪些事件进行告警以及监控确实需要花费想当长的一段时间.因为,并非所有的指标等级都是一致.因此我们需要摸索出一套简单的方法,便于管理所有指标,而且 ...

  7. 第4章Zabbix监控实践

    p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...

  8. spring boot +RabbitMQ +InfluxDB+Grafara监控实践

    本文需要有相关spring boot 或spring cloud 相关微服务框架的基础,如果您具备相关基础可以很容易的实现下述过程!!!!!!! 希望本文的所说对需要的您有所帮助 从这里我们开始进入闲 ...

  9. Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践

    0x00 初衷 最近参与的几个项目,无一例外对监控都有极强的要求,需要对项目中各组件进行详细监控,如服务端API的请求次数.响应时间.到达率.接口错误率.分布式存储中的集群IOPS.节点在线情况.偏移 ...

随机推荐

  1. python接口自动化二(发送post请求)

    前言 一个http请求包括三个部分,为别为请求行,请求报头,消息主体,类似以下这样: 请求行 请求报头 消息主体 HTTP协议规定post提交的数据必须放在消息主体中,但是协议并没有规定必须使用什么编 ...

  2. 【NOIP2017提高组模拟12.24】B

    题目 现在你有N个数,分别为A1,A2,-,AN,现在有M组询问需要你回答.每个询问将会给你一个L和R(L<=R),保证Max{Ai}-Min{Ai}<=R-L,你需要找出并输出最小的K( ...

  3. Vue结合后台的增删改案例

    首先列表内容还是与之前的列表内容类似,不过此处我们会采用Vue中数据请求的方式来实现数据的增删.那么我们使用的Vue第三方组件就是vue-resource,vue发起请求的方式与jQuery的ajax ...

  4. jsp页面实现上传文件,并且还得支持断点续传的功能

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 首先我们需要了解的是上传文件三要素: 1.表单提交方式:post (get方式提交有大小 ...

  5. SPOJ 913 Query on a tree II

    spoj题面 Time limit 433 ms //spoj的时限都那么奇怪 Memory limit 1572864 kB //1.5个G,疯了 Code length Limit 15000 B ...

  6. 【python 应用之四】提升 Python 运行性能的 7 个习惯

    大家都知道艺赛旗的 RPA 依赖于 python 语言.因此我们可以掌握一些技巧,可尽量提高 Python 程序性能,也可以避免不必要的资源浪费.1.使用局部变量 尽量使用局部变量代替全局变量:便于维 ...

  7. Shell test命令/流程控制

    Shell test命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值.字符和文件三个方面的测试. 数值测试 参数,说明 -eq等于则为真 -ne不等于则为真 -gt 大于则 ...

  8. webpack4常用片段

    webpack 4常用 初始化 npm init // Webpack 4.0以后需要单独安装 npm install webpack webpack-cli --save-dev 基础的config ...

  9. Sass 的 & 符号(ampersands)

    重复声明 有时您需要击败第三方 CSS 库的声明来获取样式的所有权: .parent.parent {} 这种方式比使用和 ID,内联样式或!important的压倒性弱,并且它可能比使用任意父元素限 ...

  10. 阶段3 1.Mybatis_08.动态SQL_01.mybatis中的动态sql语句-if标签

    创建新的工程 复制到新建的项目里面 pom.xml依赖部分复制过来 dao中整理代码 只保留四个查询 映射文件也只保留四个查询方法 增加一个根据条件查询的方法. 由于用了别名,所以parpameter ...