【监控实践】【4.1】利用trace实现阻塞跟踪和慢查询跟踪
原文: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实现阻塞跟踪和慢查询跟踪的更多相关文章
- Kubernetes监控实践
一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...
- 【译】Kubernetes监控实践(2):可行监控方案之Prometheus和Sensu
本文介绍两个可行的K8s监控方案:Prometheus和Sensu.两个方案都能全面提供系统级的监控数据,帮助开发人员跟踪K8s关键组件的性能.定位故障.接收预警. 拓展阅读:Kubernetes监控 ...
- Windows性能计数器监控实践
Windows性能计数器(Performance Counter)是Windows提供的一种系统功能,它能实时采集.分析系统内的应用程序.服务.驱动程序等的性能数据,以此来分析系统的瓶颈.监控组件的表 ...
- 利用百度API Store接口进行火车票查询
火车票查询 项目源码下载链接: Github:https://github.com/VincentWYJ/TrainTicketQuery 博客文件:http://files.cnblogs.com/ ...
- Windows应用程序进程级别统一监控实践
一般的系统级别指标监控,更多关注CPU.内存.磁盘.网络等运行情况,对应用程序运行时的进程指标关注不够,导致不能深入了解系统运行状态.本文根据笔者应用实践,探讨一下进程级别监控涉及到的监控内容以及监控 ...
- 从 IT 中断中学到的最佳监控实践
每个运维监控工具,一般要追踪数十万个内部性能指标.学会对哪些事件进行告警以及监控确实需要花费想当长的一段时间.因为,并非所有的指标等级都是一致.因此我们需要摸索出一套简单的方法,便于管理所有指标,而且 ...
- 第4章Zabbix监控实践
p.MsoNormal,li.MsoNormal,div.MsoNormal { margin: 0cm; margin-bottom: .0001pt; text-align: justify; t ...
- spring boot +RabbitMQ +InfluxDB+Grafara监控实践
本文需要有相关spring boot 或spring cloud 相关微服务框架的基础,如果您具备相关基础可以很容易的实现下述过程!!!!!!! 希望本文的所说对需要的您有所帮助 从这里我们开始进入闲 ...
- Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践
0x00 初衷 最近参与的几个项目,无一例外对监控都有极强的要求,需要对项目中各组件进行详细监控,如服务端API的请求次数.响应时间.到达率.接口错误率.分布式存储中的集群IOPS.节点在线情况.偏移 ...
随机推荐
- 软件的三大类型-单机类型、BS类型、CS类型
单机类型:最开始的软件就是那些不需要联网的单机软件. CS类型:有的程序需要统一管理软件中使用的数据, 所以就将保存数据的数据库统一存放在一台主机中, 所有的用户在需要数据时都要从主机获取, 这时就分 ...
- rsync快速部署记录
rsync快速部署记录 安装rsync和使用环境:客户端:10.192.30.59 fudao_db_cluster_002 (将本地文件备份到服务端)服务端:10.192.30.60 fudao_d ...
- elasticsearch基本Restful操作
1.添加数据curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/megacorp/emplo ...
- layui静态表格固定td宽度,table固定td宽度
正在做一个项目,要求数据表的列是不固定的,有可能是有10列,有可能是20列,第一列宽度要固定,然后我怎么设置都没有用, 这个问题困扰了我三天,后来终于百度到了, 这个博客: https://www.c ...
- c++11相关特性
前言 发现好多情况下都会用到c++11的新特性啊. 所以稍稍总结一下,只会粗略的说,不会详细的讲…… upd.csp-s可能不是c++11标准,请慎用.(博主考试CE后的善意提醒) 1.auto&am ...
- sh_05_偶数求和
sh_05_偶数求和 # 计算 0 ~ 100 之间 所有 偶数 的累计求和结果 # 开发步骤 # # 1. 编写循环 确认 要计算的数字 # 2. 添加 结果 变量,在循环内部 处理计算结果 # 1 ...
- 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,对象无效。不允许有扩展属性,或对象不存在。
不知道网上为啥有那么多复制粘贴的文章,写点原创不好吗?堂而皇之的贴别人的文章有意思吗? 消息 15135,级别 16,状态 8,过程 sp_addextendedproperty,对象无效.不允许有扩 ...
- [BZOJ2870]最长道路tree:点分治
算法一:点分治+线段树 分析 说是线段树,但是其实要写树状数组卡常. 代码 #include <bits/stdc++.h> #define rin(i,a,b) for(register ...
- 【转】C语言中数组名和指针的区别
注:本文转自http://www.cnblogs.com/furaibo/archive/2010/03/19/1689710.html 魔幻数组名 请看程序(本文程序在WIN32平台下编译): #i ...
- HDU2294--Pendant(DP,矩阵优化)
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
