原始脚本来自TG,自己对部分脚本做了调整,分享出来仅供参考,请勿整篇Copy!
使用以下语句获取【CPU使用率】
USE [DBA_Monitor] GO /****** 对象: StoredProcedure [dbo].[DBA_Pro_Get_CpuUseInfo] 脚本日期: 02/07/2017 16:26:07 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /****************************************************************** 【概要说明】 <作 者> DBA <创建时间> 2015/01/24 10:27 <中文名称> 获取SQLServer进程CPU使用率 <功能说明> 采集当前SQL实例下面的SQLServer进程CPU使用率 <调用方式> 作业方式定时调用为主;错误处理后,维护人员手工调用为辅 <执行说明> 先决条件:正确的传递实例编号参数@InstanceID 注意事项:暂无 <调用示例> exec DBA_Pro_Get_ErrorLog 100233,'UestMail@163.com' 【修订记录】 ------------------------------------------------------------------- <2015/01/24 10:27> <DBA>: 创建 ******************************************************************/ ALTER proc [dbo].[DBA_Pro_Get_CpuUseInfo] @InstanceID int, @Recipients VARCHAR(200)=null as BEGIN SET NOCOUNT ON IF (@InstanceID<100000 or @InstanceID>999999) begin print '数据库实例编号参数错误!' return end BEGIN TRY --抓取SQL进程内使用CPU的情况 DECLARE @ts_now bigint SELECT @ts_now=cpu_ticks/(cpu_ticks/ms_ticks)FROM sys.dm_os_sys_info --获取最近10分钟的CPU使用率信息 SELECT TOP(10) SQLProcessUtilization AS [SQLServerProcessCPUUtilization], SystemIdle AS [SystemIdleProcess], (100 - SystemIdle - SQLProcessUtilization) AS [OtherProcessCPUUtilization], DATEADD(ms, -1 * (@ts_now - [timestamp]), GETDATE()) AS [EventTime] into #CPU_Temp FROM ( SELECT record.value('(./Record/@id)[1]', 'int') AS record_id, record.value('(./Record/SchedulerMonitorEvent/SystemHealth/SystemIdle)[1]', 'int') AS [SystemIdle], record.value('(./Record/SchedulerMonitorEvent/SystemHealth/ProcessUtilization)[1]', 'int') AS [SQLProcessUtilization], [timestamp] FROM ( SELECT [timestamp], CONVERT(xml, record) AS [record] FROM sys.dm_os_ring_buffers WHERE ring_buffer_type = N'RING_BUFFER_SCHEDULER_MONITOR' AND record LIKE N'%<SystemHealth>%' ) AS x ) AS y ORDER BY record_id DESC --获取sqlserver进程CPU使用率大于40%的总次数和实际最大值 declare @CpuTooHighNums int --总次数 declare @CpuTooHighValue int --最大值 select @CpuTooHighNums=IsNull(count(1),0),@CpuTooHighValue=IsNull(max(SQLServerProcessCPUUtilization),0) from #CPU_Temp where SQLServerProcessCPUUtilization>40 insert into Info_CpuUseLog (InstanceID,SystemIdleProcess,SQLServerProcessCPUUtilization,OtherProcessCPUUtilization,EventTime) select @InstanceID,SystemIdleProcess,SQLServerProcessCPUUtilization,OtherProcessCPUUtilization,EventTime from #CPU_Temp WHERE SQLServerProcessCPUUtilization>0 order by EventTime /*--如果最近10分钟内sqlserver进程CPU使用率超过40%的次数>=5,发邮件预警 IF (@CpuTooHighNums>=5) begin declare @bodyTemp01 varchar(1000) declare @subject varchar(64) declare @ip varchar(15) declare @HostName varchar(64) select @bodyTemp01= '最近10分钟,有'+Cast(@CpuTooHighNums as varchar(10))+'次SQLServer进程CPU使用率高于:40%;最高为:'+Cast(@CpuTooHighValue as varchar(10))+'%' select @IP=Reverse(left(Reverse(IntranetIP),charindex('.',Reverse(IntranetIP))-1)) FROM Info_Hardware where ServerID=left(@InstanceID,4) select @HostName=HostName From dbo.Info_Instance where InstanceID=@InstanceID IF @ip IS NOT NULL set @subject='['+@ip+'][重要] CPU使用率预警' ELSE set @subject='[重要] CPU使用率预警' DECLARE @tableHTML NVARCHAR(MAX); SET @tableHTML = N'<style>td{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}th{FONT-FAMILY: Tahoma,宋体; FONT-SIZE: 12px; LINE-HEIGHT: 20px; TEXT-DECORATION: none;BORDER-BOTTOM: black 1px solid;BORDER-RIGHT: black 1px solid;}</style> <H2>'+@HostName+'数据库CPU使用率预警</H2>'+@bodyTemp01+'<br /> 报表时间:'+Convert(varchar(19),getdate(),121)+ N'<table width = "100%" table border="0" cellspacing="0" cellpadding="0" style="BORDER-LEFT: black 1px solid;BORDER-TOP: black 1px solid"> <tr><th>序号</th><th>SQLServer进程CPU使用率%</th><th>其他进程CPU使用率%</th><th>系统空闲百分比%</th><th>取样时间</th></tr>' + CAST ( ( SELECT td = ROW_NUMBER() OVER (ORDER BY EventTime desc),'', td = SQLServerProcessCPUUtilization,'', td = OtherProcessCPUUtilization,'', td = SystemIdleProcess,'', td = convert(varchar(19),EventTime,121),'' FROM #CPU_Temp order by EventTime desc FOR XML PATH('tr') ) AS NVARCHAR(MAX) ) + N'</table>' +'<br />邮件发送条件: <br />1、最近10分钟SQLServer进程CPU使用率超过40%的次数>=5'; --select @tableHTML; EXEC msdb.dbo.sp_send_dbmail @profile_name = 'LKProfile', @recipients = @Recipients, @subject = @subject, @body = @tableHTML, @body_format = 'HTML'; end*/ if object_id('tempdb..#cpu_temp')is not null drop table #CPU_Temp END TRY BEGIN CATCH insert into ExecErrorLog(InstanceID,Error_Procname,Error_Numbers,Error_Messages,Error_Serverity,Error_States,Error_Lines) SELECT @InstanceID,ERROR_PROCEDURE(),ERROR_NUMBER(),ERROR_MESSAGE(),ERROR_SEVERITY(),ERROR_STATE(),ERROR_LINE() END CATCH END