SQL Server监控系列之调优排错

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

使用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最终查询不到该跟踪

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

  用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句(超过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 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最终查询不到该跟踪

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

  用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句(超过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 TraceID=@TraceID GOTO finish ERROR: SELECT ErrorCode=@rc 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的数据收集监控.


本文出自seven的测试人生公众号最新内容请见作者的GitHub页:http://qaseven.github.io/

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 数据采集 监控
局域网监控电脑屏幕软件:PL/SQL 实现的数据库关联监控
在当今网络环境中,基于PL/SQL的局域网监控系统对于企业和机构的信息安全至关重要。该系统包括屏幕数据采集、数据处理与分析、数据库关联与存储三个核心模块,能够提供全面而准确的监控信息,帮助管理者有效监督局域网内的电脑使用情况。
35 2
|
3月前
|
存储 SQL 关系型数据库
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
MySQL调优主要分为三个步骤:监控报警、排查慢SQL、MySQL调优。 排查慢SQL:开启慢查询日志 、找出最慢的几条SQL、分析查询计划 。 MySQL调优: 基础优化:缓存优化、硬件优化、参数优化、定期清理垃圾、使用合适的存储引擎、读写分离、分库分表; 表设计优化:数据类型优化、冷热数据分表等。 索引优化:考虑索引失效的11个场景、遵循索引设计原则、连接查询优化、排序优化、深分页查询优化、覆盖索引、索引下推、用普通索引等。 SQL优化。
650 15
【MySQL调优】如何进行MySQL调优?从参数、数据建模、索引、SQL语句等方向,三万字详细解读MySQL的性能优化方案(2024版)
|
1月前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
30 0
|
2月前
|
SQL Oracle 关系型数据库
Oracle SQL:了解执行计划和性能调优
Oracle SQL:了解执行计划和性能调优
76 1
|
3月前
|
SQL 分布式计算 数据库
SQL调优总结
数据库表的规范化和反规范化设计,设计合适的字段数据类型……
49 8
|
4月前
|
SQL 监控 Java
SQL质量监控
为帮助用户管理和优化SLS中的SQL查询,提供了用户级SQL质量监控功能,集成于CloudLens for SLS。开启服务后约10分钟,用户可在「报表中心 / SQL质量监控」中查看数据。 该功能包括: SQL健康分和使用报告:反馈总体质量。 服务指标:如请求PV数、平均延时等,用于业务分析。 运行指标:如并发请求、处理数据量等。 SQL Pattern分析:提炼SQL语义特征,识别业务特征。 质量优化建议:基于请求成功率和错误码分布给出改进建议。 监控功能以分钟为单位聚合分析数据,不包括JDBC接入和ScheduledSQL流量,并可能随产品发展而调整。这些功能有助于用户全面掌握SQL
SQL质量监控
|
3月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
WXM
|
5月前
|
SQL 运维 分布式计算
如何做好SQL质量监控
为满足用户对SQL分析行为的监控和质量管理需求,我们推出了用户级SQL质量监控功能。此功能集成于CloudLens for SLS中,可轻松开启以监控和管理所有SLS相关资源(包括采集接入、读写操作、作业、配额、SQL、计费等)。
WXM
39 2
如何做好SQL质量监控
|
5月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
135 13
|
5月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。