SQL SERVER常见异常监控方式

SQL SERVER常见问题

现象:CPU使用率100%

分析: 开启Windows任务管理器 确认是sql server进程(sqlserver.exe)占用了大量CPU资源(如果是多实例,需要确认是哪个实例占用的大量资源).

    确认是SQL SERVER占用大量CPU资源后,用SSMS连接到异常实例上.

    执行如下SQL:

–查看sysprocesses中执行时间超过1秒的SQL信息
WITH ProcessCTE(blocked) AS
(SELECT spid FROM sys.sysprocesses WHERE lastwaittype in (‘SOS_SCHEDULER_YIELD’,’CXPACKET’) and status in (‘runnable’,’suspended’) and cpu>1000)
SELECT distinct  a.[TEXT] as ‘异常SQL’ ,spid as ‘异常SQL对应的进程ID’ ,waittime as ‘等待时间(ms)’ ,lastwaittype as ‘等待状态’ ,db_name(dbid) as ‘库名’ ,cpu as ‘CPU占用时间’ ,
last_batch as ‘批处理最近提交时间’ ,[status] as ‘进程状态’ ,[hostname] as ‘应用服务器名’ ,[program_name] as ‘连接’ ,hostprocess as ‘应用服务器进程ID’ ,loginame as ‘登陆用户’ 
FROM (SELECT TEXT,AA.* FROM sys.sysprocesses AA CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)) as a
JOIN ProcessCTE bucte WITH(NOLOCK) ON bucte.blocked=a.spid
ORDER BY a.CPU desc

解决办法:找到异常SQL后可以考虑针对性的新增索引,

90%情况下新增索引后即可恢复,但新增前需要关注表的数据量,当数据大小超过5GB时需要特别注意.

另外还可以确认是否有新功能上线,先将功能回滚,然后挑选服务窗口期(DB访问量小的时候)加上索引后再上线.

现象:SQL阻塞,SQL执行超时,SQL执行变慢

分析:执行下述SQL

–查看sysprocesses中阻塞及产生阻塞的session的SQL信息
WITH ProcessCTE(blocked) AS
(SELECT blocked FROM sys.sysprocesses WHERE blocked>0
union all SELECT spid FROM sys.sysprocesses WHERE blocked>0)
SELECT distinct [TEXT] as ‘阻塞脚本’ ,spid as ‘进程ID’ ,a.blocked as ‘上层阻塞进程ID’ ,waittime as ‘已经等待的时间’ ,lastwaittype as ‘等待状态’ , db_name(dbid) as ‘数据库’ , last_batch as ‘批处理最近提交时间’
, [status] as ‘进程状态’ , [hostname] as ‘应用服务器名’ , [program_name] as ‘连接’ , hostprocess as ‘应用服务器进程ID’ , loginame as ‘登陆用户’ 
  FROM (SELECT [TEXT],AA.* FROM sys.sysprocesses AA
    CROSS APPLY sys.dm_exec_sql_text(AA.sql_handle)) as a
  JOIN ProcessCTE bucte WITH(NOLOCK) ON bucte.blocked=a.spid
ORDER BY a.blocked,a.spid

重点关注结果中blocked = 0的进程.

解决办法:确认是否可以加上脏读(with (nolock)),是否可以新增索引.

本期的最后附赠2个日常运维中的常用的脚本(获取最耗CPU的SQL),关注下述二维码,关注思想学堂,回复”CPU”即可获得;

《SQL SERVER常见异常监控方式》 扫描二维码,关注思想学堂

    原文作者:疯狂十字军
    原文地址: https://www.jianshu.com/p/bb1a98d32822
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞