5. SQL Server数据库性能监控 - 当前请求
原文:5. SQL Server数据库性能监控 - 当前请求
对于在线运行的系统,当前数据库性能监控,通常监视以下几点:
(1) 是否有阻塞 (Blocking);
(2) 是否有等待 (Waiting),阻塞就是锁 (Lock) 等待;
(3) 是否运行时间过长(Long running);
(4) 是否有死锁 (Deadlock);
sys.dm_exec_query_stats之类,等一些统计性的信息,通常不作为实时告警内容,而是在性能优化时,作为参考。
一. 阻塞/等待/长时间运行
1. SQL Server 2005 及以后版本检查
SELECT r.session_id
,r.blocking_session_id
,DB_Name(r.database_id) as database_name
,r.start_time
,r.total_elapsed_time
,r.[status]
,CASE WHEN r.blocking_session_id <> 0 THEN 'Blocking'
WHEN r.blocking_session_id = 0 AND r.wait_type is not null THEN 'Waiting'
ELSE 'Long-running'
END as slowness_type
,r.percent_complete
,r.command
,r.wait_type
,r.wait_time
,r.wait_resource
,r.last_wait_type
,r.cpu_time
,r.reads
,r.writes
,r.logical_reads
,t.[text] as executing_batch
,SUBSTRING(t.[text],
r.statement_start_offset/2,
(CASE WHEN r.statement_end_offset = -1
THEN DATALENGTH (t.[text]) --LEN(CONVERT(NVARCHAR(MAX), t.text)) * 2
ELSE r.statement_end_offset
END - r.statement_start_offset )/2 + 1) as executing_sql
,bt.[text] as blocking_batch
,SUBSTRING(bt.[text],
br.statement_start_offset/2,
(CASE WHEN br.statement_end_offset = -1
THEN DATALENGTH (bt.[text]) --LEN(CONVERT(NVARCHAR(MAX), bt.text)) * 2
ELSE br.statement_end_offset
END - br.statement_start_offset )/2 + 1) as blocking_sql
--,p.query_plan
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) as t
CROSS APPLY sys.dm_exec_query_plan(r.plan_handle) as p
LEFT JOIN sys.dm_exec_requests br
ON r.blocking_session_id = br.session_id
OUTER APPLY sys.dm_exec_sql_text(br.session_id) as bt
WHERE r.session_id > 50 and r.session_id <> @@SPID
AND r.total_elapsed_time > 30 * 60 * 1000
ORDER BY r.total_elapsed_time DESC;
以上脚本返回运行超过30分钟的语句,需要注意的是:
(1) 如果返回执行计划,会让以上脚本变慢很多,可以不返回,在收到告警后检查语句时,再去查看执行计划;
(2) 显示TEXT,比如: xp_cmdshell这样的语句,start_offset, end_offset都为0,截取的 text是空白,只有看TEXT才知道是什么语句;还有就是有时需要知道这个请求来自哪个batch或者存储过程;
(3) 有时显示TEXT还不够,还以xp_cmdshell为例,需要dbcc inputbuffer才能看到完整的sql语句;另外已运行结束但还没有commit/rollback的事务,在requests中已经没有了,也需要借用dbcc inputbuffer来查看sql 语句;
dbcc inputbuffer(@@SPID)
(4) SQL Agent作业,在这里会被一并检查,也可以通过msdb..sysjobactivity另行检查;
select b.name, *
from msdb..sysjobactivity a
inner join msdb.dbo.sysjobs b
on a.job_id = b.job_id
where b.name like '%backup%'
2. SQL Server 2000沿用过来的方法
select p.dbid, p.spid, p.blocked, p.waittime/1000.0/60.0 as wait_minutes,
ISNULL(DATEDIFF(MI, p.last_batch, GETDATE()), 0) elapsed_minutes,
p.last_batch, p.status, p.program_name,
(select [text] FROM ::fn_get_sql(p.sql_handle)) sql_text
from master..sysprocesses p
where spid > 50 and spid <> @@SPID
AND (status <> 'sleeping' AND ISNULL(DATEDIFF(MI, p.last_batch, GETDATE()), 0) > 30)
以上脚本返回运行超过30分钟的语句,需要注意的是:
sysprocesses中把connection/session/request信息三者合一,其中没有请求开始的具体时间,通过last_batch监视运行时长并不准确。测试如下:
(1) 通过ISQL连接到SQL Server,如果当前连接没发起过任何请求,last_batch的时间为 1900-01-01 00:00:00,在此连接上发起请求时,通过last_batch计算当前请求运行时长不准确;
(2) 在SQL Analyzer/SSMS中新建查询窗口,未发起任何查询时,last_batch与login_time一样,而非1900-01-01 00:00:00,通过last_batch计算当前请求运行时长不准确;或者当前窗口发起的请求已结束,但窗口/连接未关闭,则在此连接上再次发起请求,last_batch为上次请求结束的时间,通过last_batch计算当前请求运行时长也不准确;
(3) SQL Agent作业运行结束后,会把在sysprocesses的连接关闭,下次运行时重新建立连接,新建连接中last_batch等于login_time,通过last_batch计算作业运行时长准确;
作为一个老的方法,估且不再去深究,不过用sysprocesses来监视阻塞/等待还是没有问题的,另外作业的运行时长也是可以监视的,脚本改动后如下:
select p.dbid, p.spid, p.blocked, p.waittime/1000.0/60.0 as wait_minutes,
ISNULL(DATEDIFF(MI, p.last_batch, GETDATE()), 0) elapsed_minutes,
p.last_batch, p.status, p.program_name,
(select [text] FROM ::fn_get_sql(p.sql_handle)) sql_text
from master..sysprocesses p
where spid > 50 and spid <> @@SPID
and (
(p.program_name like 'SQLAgent - TSQL JobStep (Job %' AND ISNULL(DATEDIFF(MI, p.last_batch, GETDATE()), 0) > 30)
or
(p.blocked <> 0 and p.waittime/1000.0/60.0 > 30)
)
这样一来,只剩下未被阻塞但长时间运行的sql请求未被监视到。如果一定要全面监视的话,可以选择开启跟踪,进而分析跟踪文件。
二. 死锁
死锁的监控可以通过监视SQL Server的ERRORLOG来实现,不过需要事先打开死锁的跟踪标记。脚本如下:
--sql server 2000
dbcc traceon(1204,-1) --sql server 2005 +
dbcc traceon(1222,-1)
这样发生死锁时,死锁详细信息就会被写入ERRORLOG,检查deadlock或者victim关键字即可进行监控。
小结
各个语句的运行时长/基线并不一样,通常不好设置统一的阀值,有时会借用第三方工具针对不同的请求设置不同的时长阀值并告警,所以在数据库这层大多告警阻塞即可,大致步骤如下 :
(1) 部署数据库邮件;
(2) 部署作业:定时检查阻塞,发邮件告警。
5. SQL Server数据库性能监控 - 当前请求的更多相关文章
- sql server数据库状态监控
sql server数据库监控 转自:https://www.cnblogs.com/seusoftware/category/500793.html 6. SQL Server数据库监控 - 如 ...
- 4. SQL Server数据库状态监控 - 作业状态
原文:4. SQL Server数据库状态监控 - 作业状态 有很多地方可以设置定时任务,比如:Windows的计划任务,Linux下的crontab,各种开发工具里的timer组件.SQL Serv ...
- 2. SQL Server数据库状态监控 - 错误日志
原文:2. SQL Server数据库状态监控 - 错误日志 无论是操作系统 (Unix 或者Windows),还是应用程序 (Web 服务,数据库系统等等) ,通常都有自身的日志机制,以便故障时追溯 ...
- 3. SQL Server数据库状态监控 - 可用空间
原文:3. SQL Server数据库状态监控 - 可用空间 数据库用来存放数据,那么肯定需要存储空间,所以对磁盘空间的监视自然就很有必要了. 一. 磁盘可用空间 1. 操作系统命令或脚本.接口或工具 ...
- SQL Server数据库性能优化之SQL语句篇【转】
SQL Server数据库性能优化之SQL语句篇http://www.blogjava.net/allen-zhe/archive/2010/07/23/326927.html 近期项目需要, 做了一 ...
- Sql Server数据库性能优化之索引
最近在做SQL Server数据库性能优化,因此复习下一索引.视图.存储过程等知识点.本篇为索引篇,知识整理来源于互联网. 索引加快检索表中数据的方法,它对数据表中一个或者多个列的值进行结构排序,是数 ...
- SQL Server数据库性能优化之索引篇【转】
http://www.blogjava.net/allen-zhe/archive/2010/07/23/326966.html 性能优化之索引篇 近期项目需要, 做了一段时间的SQL Server性 ...
- SQL Server数据库性能优化技巧
查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引: 2.I/O吞吐量小,形成了瓶颈效应: 3.内存不足: 4.网络速度慢: 5.查询出的数据量过大: 6.锁或者死锁: 7.返回了不必 ...
- SQL Server数据库性能优化(二)之 索引优化
参考文献 http://isky000.com/database/mysql-performance-tuning-index 原文作者是做mysql 优化的 但是我觉得 在索引方面 ...
随机推荐
- 小牟Andorid下面MD5具体实现的思路总结
Android的开发往往需要一定数目demo 从今起MD5一些加密算法提取物 看看是如何实现的 首先,我们必须明确为什么加密? 1 数据安全处理 2 防止数据窃取 3 有效的避免恶意攻击 4 保证文件 ...
- UVa 10491 - Cows and Cars
題目:有m+n個們,每個門後面有牛或者車:有n仅仅牛,m輛車,你選擇当中1個: 然後打開当中的k你沒有選中的門後是牛的,問你改變選時得到車的概率. 說明:數學題,概率.全概率公式就可以: 說明:第10 ...
- C指针决心 ------ 指针表达式
本文是自己学习所做笔记.欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 所谓的指针表达式是指一个表达式.其结果是一个指针. 例1. int a,b; ...
- .Net程序猿乐Android发展---(10)框架布局FrameLayout
帧布局FrameLayout中全部的控件都在界面的左上側,后绘制的空间会覆盖之前的控件.布局内控件以层叠方式显示,用在游戏开发方面可能多些. 1.层叠展示 以下这个样例 ...
- JAVA基金会 (三)反射 反思的深度分析
上一页已经推出反映的一些基本概念,这主要是通过一个例子反映谈的过程,以及样品的实际应用. 这个样例是这种设计思路:从一个属性文件里读取一段字符串,然后,依据该字符串生成相应的类实例对象:这之后另一个增 ...
- net开源cms系统
.net开源cms系统推荐 内容目录: 提起开源cms,大家第一想到的是php的cms,因为php开源的最早,也最为用户和站长们认可,随着各大cms系统的功能的不断完善和各式各样的开源cms的出现,. ...
- Gradle sourceCompatibility has no effect to subprojects(转)
I have Java 6 and 7 installed on my machine. Gradle uses 1.7 (checked using gradle -v). But I need t ...
- spring多数据源的配置(转)
C3P0和DBCP的区别 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等. d ...
- boostrap-非常好用但是容易让人忽略的地方------Font Awesome
font-awesome基本用法 官方代码传送门 font-awesome在bootstrap中的特殊用法(这个才是重点) 要点归纳1(官方) 官方代码传送门 要点归纳2(我的) <a href ...
- 初探boost之progress_display库学习笔记
progress_display 用途 progress_display能够在控制台上显示程序的运行进度,假设程序运行非常耗费时间,那么它能提供一个友好的用户界 面,不至于让用户在等待中失去耐心,甚至 ...