SQL Server 监控 使用sp_trace_create

监控前言

上一节我们提到了MSSQL的基于SQL Event的监控,但是有些时候我们需要更加详细、适用于调优排错的监控。SQL Server内部运行的可见性是的查询调整、优化和综合排查成为可能!这一节主要和大家说说SQL Server跟踪(SQL Server Profile)的一些监控方式和途径。

使用场景

    记得某次给一家公司调优的时候,负责人发给我一堆业务的T-SQL脚本,我面对海量脚本还是从容,虽然不了解内部复杂的业务,但是我们得专注问题的关键 “慢”,我们根据查询的“慢”把他们筛选出来,一一调式优化,不就迅速解决问题吗?三天后,负责人含泪握着我的手,哥们辛苦了,查询响应得到了质的改善。

跟踪提供者

    SQL Server 为我们两者提供跟踪的方式:一种是一个物理文件(可保存在本机或者UNC网络路径),一种是行集。对于后者大家应该比较熟悉

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

详细的我暂时不介绍,先说说两者的区别和类同点 DIFFAndSame(行集,文件提供者)。

  • 两者都是用类似Buffer来保存当前的事件数据,很明显是为了减少IO的压力,这样可以不阻塞和尽量不遗漏 事件数据,当Buffer 到达一定量时候可能才会Flush到磁盘或者发送到网络的终端(客户端)显示监控行集。
  • 物理文件保存监控结果的方式的重要保证是不能遗漏任何事件,一旦IO降速的时候,可能会影响到整个T-SQL的执行情况。
    SELECT * FROM sys.dm_os_wait_stats WHERE wait_type IN (‘SQLTRACE_LOCK‘,‘IO_COMPLETION‘);
    我使用这个语句来监控TRACE 和IO 完成对我当前机器的影响,我的某个客户的IO情况:                       

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 Profile监控GUI 直接展现给我们看到的。但是,我是非常不建议使用的,首先如果Buffer满了,它有一定的延迟,可能会抛弃事件已清空缓存区继续接受事件,而事件没有发送到Client,也没有写到物理文件,自然就丢失了。比如,SQL Server Profile 在DB服务器进行监控,因为高负载的机器再用来展示,很有可能就会丢失事件,另外物理文件方式,其实是接受一个足够大的Buffer,进行的大块写操作,性能是优于行集的。

(行集)

保密性原则

    SQL Server的安全特性会自动过滤 包含隐私的数据,比如密码。我在我的SSMS中执行了如下的语句:

EXEC sp_password ‘pp‘,‘pp1‘,‘sa‘;
这是修改sa帐号密码的系统sp,我打开了SQL Server Profile –> 选择了T-SQL 监控模版 
然后执行上面的存储过程,监控结果:

监控结果:--*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 脚本,不过还是建议大家熟悉这几个存储过程:

  • sp_trace_create 定义跟踪 ,创建的跟踪会在sys.traces查询的到。
  • s_trace_setevent 设置监控事件
  • sp_trace_setfilter 设置过滤
  • sp_trace_setstatus 设置跟踪的状态  常用的是  sp_trace_setstatus @traceid,0 停止功能 、sp_trace_setstatus @traceid,2 移除跟踪,这将导致sys.traces最终查询不到该跟踪

其实整个跟踪还是比较简单的。我这里有一个常用的脚本:

 

可以查询所有的跟踪计划:

SELECT * FROM sys.traces

停止,删除, 要先停止才能删除:

EXEC sp_trace_setstatus 2,0    --停止,  第一个参数为SELECT * FROM sys.traces中的ID列

EXEC sp_trace_setstatus 2,2    --删除

 

 

用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句(超过5MB的文件,会执行ROLLOVER,根据文件名在后面添加类似_1,_2.trc的跟踪结果):

CREATE PROC [dbo].[sp_trace_sql_durtion]
    @DatabaseName nvarchar(128),
    @Seconds bigint,
    @FilePath nvarchar(260)
AS
BEGIN
DECLARE @rc int,@TraceID int,@MaxFileSize bigint;
SET @MaxFileSize = 5;
 
EXEC sp_trace_create @TraceID OUTPUT,2,@FilePath,@MaxFileSize,NULL;
 
IF @rc != 0 
    RETURN;
 
DECLARE @On bit;
SET @On = 1;
 
EXEC sp_trace_setevent @TraceID,10,35,@On;
EXEC sp_trace_setevent @TraceID,10,1,@On;
EXEC sp_trace_setevent @TraceID,10,13,@On;
EXEC sp_trace_setevent @TraceID,41,35,@On;
EXEC sp_trace_setevent @TraceID,41,1,@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
    EXEC sp_trace_setfilter @TraceID,35,0,0,@DatabaseName
 
EXEC sp_trace_setstatus @TraceID,1
SELECT TraceID = @TraceID;
 
END

参数非常的明了,数据库名称、执行事件超过多少秒、保存的路径。

当我们运行这个脚本一段事件以后,可以快速的发现大量耗时的T-SQL,我们可以通过

SELECT * FROM fn_trace_gettable(N‘监控文件路径‘,1);
来查看行方式的结果。
同样的富有创造力的读者可以自己创建监控锁定,监控死锁等方式保存文件,但是我的建议是尽可能的减少噪音,也就是说我们要达到什么目地就
建立什么功能,这样才能将大问题细化解决。
在《Microsfot SQL Server 2005 技术内幕: T-SQL 程序设计》 中有一个正则,用来将类似的语句全部组合成,只有参数形式替换具体值
的SQL CLR,但是我认为那个正则还有bug,等我空了给大家写一个,自己也能使用的更完善。
监控异常
    在上个系列中,讲述了具体的SQL Event抓去的异常,可以及时通知,但是具体的异常信息,并不是特别详细。因此我们可以选择事件中的
Error来添加有关T-SQL批处理和SP的所有异常,用于分析,这个跟踪非常有利于我们监控一些异常情况!!!
我创建了一个跟踪的脚本,和上面的跟踪事件的脚本一样,超过5MB RollOver。
    我们要定期的执行这个跟踪,虽然不建议长期开启,但是定期监控处理异常是有利我们系统更加长时间运作的。
CREATE PROC [dbo].[sp_trace_sql_exception]
    @FilePath nvarchar(260)
AS
DECLARE @rc int,@TraceID int,@Maxfilesize bigint
SET @maxfilesize = 5 
 
 
EXEC @rc = sp_trace_create @TraceID output, 2, @FilePath, @Maxfilesize, NULL 
IF (@rc != 0) 
    RETURN;
 
DECLARE @on bit
SET @on = 1
EXEC sp_trace_setevent @TraceID, 33, 1, @on
EXEC sp_trace_setevent @TraceID, 33, 14, @on
EXEC sp_trace_setevent @TraceID, 33, 51, @on
EXEC sp_trace_setevent @TraceID, 33, 12, @on
EXEC sp_trace_setevent @TraceID, 11, 2, @on
EXEC sp_trace_setevent @TraceID, 11, 14, @on
EXEC sp_trace_setevent @TraceID, 11, 51, @on
EXEC sp_trace_setevent @TraceID, 11, 12, @on
EXEC sp_trace_setevent @TraceID, 13, 1, @on
EXEC sp_trace_setevent @TraceID, 13, 14, @on
EXEC sp_trace_setevent @TraceID, 13, 51, @on
EXEC sp_trace_setevent @TraceID, 13, 12, @on
 
DECLARE @intfilter int,@bigintfilter bigint;
 
EXEC sp_trace_setstatus @TraceID, 1
 
SELECT [email protected]
GOTO finish
 
ERROR: 
SELECT [email protected]
 
FINISH: 

定期执行吧,同志们,找异常。。。

默认跟踪和黑盒跟踪

    在sys.traces中的TraceID = 1的跟踪是SQL Server 默认跟踪,这个跟踪比较轻量级,一般监控服务器的启用停止,对象的创建和删除,日志和数据文件自动增长以及其他数据库的变化。(监控那些没事删错了表的人,是最好的,当然前提不要都使用一个帐号!)

可以通过

EXEC sp_configure ‘default trace enabled‘,0;

RECONFIGURE WITH OVERRIDE;

来关闭默认跟踪。

黑盒跟踪,就是可以帮助我们诊断数据库没事自个奔了的异常,在MSDN 搜索sp_create_trace的时候应该也发现了

的选项,那么我们也能创建一个类似的存储过程来快速的创建黑盒跟踪,帮助我们诊断一些异常!

CREATE PROCEDURE sp_trace_blackbox
    @FilePath nvarchar(260)
AS
BEGIN
    DECLARE @TraceID int,@MaxFileSize bigint
    SET @MaxFileSize = 25;
    EXEC sp_trace_create @TraceID OUTPUT,8,@FilePath,@MaxFileSize
    EXEC sp_trace_setstatus @TraceID,1;

END

我这里提供@FilePath = NULL参数,这个默认就保存在SQL Server的数据文件夹中。

结尾

  这里详细的描述了SQL Server Trace 的各种功能特性,有兴趣的朋友可以深入到MSDN研究监控,我这是也只是一笔带过,也参考了MSDN 和《Microsoft SQL Server 2005调优》那本书,下面的监控可能和大家讲述 DDL触发器监控,C2审核以及SQL Server的事件通知(涉及的Service Broker我会开一个系列和大家详细说说Service Broker),最后的结束可能就是说说2008的数据收集监控,大家期待吧。休息~

 

 

引用: http://www.cnblogs.com/bhtfg538/archive/2011/01/21/1939706.html

时间: 2025-01-05 20:18:21

SQL Server 监控 使用sp_trace_create的相关文章

SQL Server 监控统计阻塞脚本信息

原文:SQL Server 监控统计阻塞脚本信息 数据库产生阻塞(Blocking)的本质原因 :SQL语句连续持有锁的时间过长 ,数目过多, 粒度过大.阻塞是事务隔离带来的副作用,它是不可避免的,而且是一个数据库系统常见的现象. 但是阻塞的时间和出现频率要控制在一定的范围内,阻塞持续的时间过长或阻塞出现过多(过于频繁),就会对数据库性能产生严重的影响. 很多时候,DBA需要知道数据库在出现性能问题时,有没有发生阻塞? 什么时候开始的?发生在那个数据库上? 阻塞发生在那些SQL语句之间? 阻塞的

SQL Server监控全解析

SQL Server监控全解析 在SQL Server的日常管理中,让SQL Server高效运行,且性能良好,是DBA需要做的事.DBA需要了解数据库的日常运行情况,对性能进行分析和调优,需要对线上环境部署监控.那我们都需要监控哪些方面呢? SQL Server服务器的CPU.内存.IO.网络流量.缓存等资源性能怎么样,各个相关服务如SQL Server服务.SQL Server代理服务等是否正常运行,这些一般使用开源的监控软件Zabbix来设置告警,当然针对数据库服务器的特性,添加一些SQL

高级DBA之路——《SQL Server 监控和诊断》

编写各大终端的程序员常常有"SQL语言很简单,DBA工作很轻松"的错觉,用惯了SQLite及其扩展框架OrmLite和GreenDAO的Android程序员更是如此,尤其当一个Android程序员看见自己上大学时又挂科又留级的损友从事DBA工作之后:"不好好学习也就只能用SQL增删改查了". 然而和各大终端编写SQL代码仅为了给界面做缓存不同,在服务器端的SQL Server的日常管理中,DBA需要考虑的是如何让SQL Server高效运行,且性能良好:DBA不仅需

0. SQL Server监控清单

原文:0. SQL Server监控清单 数据库服务器的监控可大致分为两类: (1) 状态监控:数据库服务器有没有在健康地运行? (2) 性能监控:健康运行的同时,有没有性能问题?可不可以更快些? 一. 服务器 1. 状态监控 (1) 服务器是否可访问? (2) 数据库服务是否启用? (3) 操作系统事件日志中的错误或告警 (4) 磁盘可用空间 2. 性能监控 (1) IO压力 (2) 内存使用 (3) CPU使用 (4) 网络带宽占用 这1,2,3,4是按照容易出现瓶颈的顺序排列的,由于磁盘的

SQL Server监控报警架构_如何添加报警

一.数据库邮件报警介绍 数据库邮件是从SQL Server数据库引擎发送电子邮件企业解决方案,使用简单传输协议(SMTP)发送邮件.发送邮件进程与数据库的进程隔离,因此可不用担心影响数据库服务器. 数据库邮件发送要求联网,考虑数据库服务器的安全性,不能将所有服务器的外网开启:处理如下图所示:1.监控服务器轮询每个SQL数据库服务器:2.将获取的数据在监控服务器上集中处理,3.然后通过监控服务器的邮件服务发送邮件. 二.邮件模块处理 笔者发送的邮件内容如下所示,可分为个部分:1.发送主体(发生者)

sql server监控清单

数据库服务器的监控可大致分为两类: (1) 状态监控:数据库服务器有没有在健康地运行? (2) 性能监控:健康运行的同时,有没有性能问题?可不可以更快些? 一. 服务器 1. 状态监控 (1) 服务器是否可访问? (2) 数据库服务是否启用? (3) 操作系统事件日志中的错误或告警 (4) 磁盘可用空间 2. 性能监控 (1) IO压力 (2) 内存使用 (3) CPU使用 (4) 网络带宽占用 这1,2,3,4是按照容易出现瓶颈的顺序排列的,由于磁盘的读写速度限制,通常IO是最容易出现瓶颈的地

一图胜千言 -- SQL Server 监控

原文地址:http://blog.51cto.com/ultrasql/2130477

sql server数据库状态监控

sql server数据库监控 转自:https://www.cnblogs.com/seusoftware/category/500793.html 6. SQL Server数据库监控 - 如何告警 5. SQL Server数据库性能监控 - 当前请求 4. SQL Server数据库状态监控 - 作业状态 3. SQL Server数据库状态监控 - 可用空间 2. SQL Server数据库状态监控 - 错误日志 1. SQL Server服务器监控实现方法 0. SQL Server

Performance Monitor4:监控SQL Server的IO性能

SQL Server的IO性能受到物理Disk的IO延迟和SQL Server内部执行的IO操作的影响.在监控Disk性能时,最主要的度量值(metric)是IO延迟,IO延迟是指从Application创建IO请求,到Disk完成IO请求的时间延迟.如果物理Disk不能及时完成IO请求,跟不上请求负载的速度,那么SQL Server就容易出现性能问题.SQL Server内部在执行一些特定的操作时,会和Disk做读写交互,这也会影响物理硬盘响应SQL Server的IO请求的性能,使查询进程处