首页 > 数据库 > > SQL Server 监控系列 —— 二
监控前言
上一节我们提到了MSSQL的基于SQL Event的监控,但是有些时候我们需要更加详细、适用于调优排错的监控。SQL Server内部运行的可见性是的查询调整、优化和综合排查成为可能!这一节主要和大家说说SQL Server跟踪(SQL Server Profile)的一些监控方式和途径。
使用场景
记得某次给一家公司调优的时候,负责人发给我一堆业务的T-SQL脚本,我面对海量脚本还是从容,虽然不了解内部复杂的业务,但是我们得专注问题的关键 “慢”,我们根据查询的“慢”把他们筛选出来,一一调式优化,不就迅速解决问题吗?三天后,负责人含泪握着我的手,哥们辛苦了,查询响应得到了质的改善。
跟踪提供者
SQL Server 为我们两者提供跟踪的方式:一种是一个物理文件(可保存在本机或者UNC网络路径),一种是行集。对于后者大家应该比较熟悉

这个工具在 SSMS 的 工具 –> SQL Profile

详细的我暂时不介绍,先说说两者的区别和类同点 DIFFAndSame(行集,文件提供者)。
wait_type | waiting_tasks_count | wait_time_ms | max_wait_time_ms | signal_wait_time_ms |
IO_COMPLETION | 66030898 | 24377499 | 3634 | 418960 |
SQLTRACE_LOCK | 12007 | 175943 | 1001 | 1281 |

保密性原则
SQL Server的安全特性会自动过滤 包含隐私的数据,比如密码。我在我的SSMS中执行了如下的语句:
监控结果:--*sp_password----------------------------
SQL Server Profile
使用SQL Server Profile GUI工具还是很多优势,首先是减少了我们监控的复杂性,可以快速的建立监控,在跟踪属性中,可以可以选择MSSQL为我们提供的模版,包括常用的T-SQL、T-SQL Duration、T-SQL Locks模版分别监控当前DB运行的所有查询,所有查询的耗时、所有的锁定状态。
在跟踪属性 –> 选择事件选择 我们可以选择自己需要的事件,所有的事件在MSDN 都有定义->单击列筛选器 可以自定义过滤,排序噪点干扰因素

(我随便选择了一个耗时 = 500 微妙的过滤条件)
其他的模版大家可以自己看看MSDN 手册,自己尝试一下:SQL Server 2008 R2 本机 MSDN
服务器端跟踪和物理方式收集
SQL Server Profile 只是对一些存储过程的封装,我更倾向于,自己定义常用的脚本,将监控结果保存在本机,用来大量的分析和存档。
当然涉及4个存储过程,虽然设置过滤的脚本非常麻烦,但是SQL Server Profile 可以利用 文件->导出 可以导出监控脚本意味着,我们不需要编写复杂的T-SQL 脚本,不过还是建议大家熟悉这几个存储过程:
其实整个跟踪还是比较简单的。我这里有一个常用的脚本:
用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句(超过5MB的文件,会执行ROLLOVER,根据文件名在后面添加类似_1,_2.trc的跟踪结果):
CREATE PROC [dbo].[sp_trace_sql_durtion]
@Seconds bigint,
ASDECLARE @rc int,@TraceID int,@MaxFileSize bigint;
RETURN;DECLARE @On bit;
EXEC sp_trace_setevent @TraceID,10,1,@On;
EXEC sp_trace_setevent @TraceID,41,35,@On;
EXEC sp_trace_setevent @TraceID,41,13,@On;
SET @Seconds = @Seconds * 1000000;EXEC sp_trace_setfilter @TraceID,13,0,4,@Seconds;IF @DatabaseName IS NOT NULL
SELECT TraceID = @TraceID;END
参数非常的明了,数据库名称、执行事件超过多少秒、保存的路径。
当我们运行这个脚本一段事件以后,可以快速的发现大量耗时的T-SQL,我们可以通过
CREATE PROC [dbo].[sp_trace_sql_exception]
ASSET @maxfilesize = 5 IF (@rc != 0) SET @on = 1
EXEC sp_trace_setevent @TraceID, 33, 14, @on
EXEC sp_trace_setevent @TraceID, 33, 12, @on
EXEC sp_trace_setevent @TraceID, 11, 14, @on
EXEC sp_trace_setevent @TraceID, 11, 12, @on
EXEC sp_trace_setevent @TraceID, 13, 14, @on
EXEC sp_trace_setevent @TraceID, 13, 12, @on
DECLARE @intfilter int,@bigintfilter bigint;
EXEC sp_trace_setstatus @TraceID, 1SELECT TraceID=@TraceIDSELECT ErrorCode=@rcFINISH:
定期执行吧,同志们,找异常。。。
默认跟踪和黑盒跟踪
在sys.traces中的TraceID = 1的跟踪是SQL Server 默认跟踪,这个跟踪比较轻量级,一般监控服务器的启用停止,对象的创建和删除,日志和数据文件自动增长以及其他数据库的变化。(监控那些没事删错了表的人,是最好的,当然前提不要都使用一个帐号!)
可以通过
EXEC sp_configure 'default trace enabled',0;
RECONFIGURE WITH OVERRIDE;
来关闭默认跟踪。
黑盒跟踪,就是可以帮助我们诊断数据库没事自个奔了的异常,在MSDN 搜索sp_create_trace的时候应该也发现了

的选项,那么我们也能创建一个类似的存储过程来快速的创建黑盒跟踪,帮助我们诊断一些异常!
我这里提供@FilePath = NULL参数,这个默认就保存在SQL Server的数据文件夹中。
结尾
这里详细的描述了SQL Server Trace 的各种功能特性,有兴趣的朋友可以深入到MSDN研究监控,我这是也只是一笔带过,也参考了MSDN 和《Microsoft SQL Server 2005调优》那本书,下面的监控可能和大家讲述 DDL触发器监控,C2审核以及SQL Server的事件通知(涉及的Service Broker我会开一个系列和大家详细说说Service Broker),最后的结束可能就是说说2008的数据收集监控,大家期待吧。休息~
本文来源https://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69953058/viewspace-3123495/ ,如需转载,请注明出处,否则将追究法律责任。