我想建立一个SQL Server 2008警报时的任何程序执行用于1秒或更长(只是一个例子)时通知我

任何想法?

编辑:

好,看来这是不可能的。但是,只要轻推你在另一个方向,我知道有在举办编译计数,电话和其他各种统计数据的数量的主数据库的统计数据表。难道我也许周期性地询问他们,然后报告它,不知何故?

有帮助吗?

解决方案

不存在用于此没有通知。 你必须建立一个跟踪和现在,然后查询它的每一个。

其他提示

我想添加到姆拉登Prajdic的正确答案,并在从SQL Server中央kevchadders的回答改善。我下面提出的解决方案使用DBMail代替的SQLMail(用于由xp_sendmail的调用方式SQLServerCentral的解决方案)。从本质上讲,的SQLMail使用MAPI和更难设置和DBMail使用SMTP和更容易安装。这里是更多信息关于两者之间的区别。

我无法获得SQL Server的中央的解决方案在SQL 2005和下面的解决方案只被我安装SQL 2005的测试工作 - 基于版本因人而异

首先,你需要一个新的UDF,这将作业ID转换成进程ID为联接:

CREATE FUNCTION dbo.udf_SysJobs_GetProcessid(@job_id uniqueidentifier)
RETURNS VARCHAR(8)
AS
BEGIN
    RETURN (substring(left(@job_id,8),7,2) +
    substring(left(@job_id,8),5,2) +
    substring(left(@job_id,8),3,2) +
    substring(left(@job_id,8),1,2))
END

和随后的存储过程:

CREATE PROC sp_check_job_running 
    @job_name char(50),
    @minutes_allowed int, 
    @person_to_notify varchar(50) 

AS 

DECLARE @minutes_running int, 
    @message_text varchar(255)

SELECT @minutes_running = isnull(DATEDIFF(mi, p.last_batch, getdate()), 0)
FROM master..sysprocesses p
JOIN msdb..sysjobs j ON dbo.udf_sysjobs_getprocessid(j.job_id) = substring(p.program_name,32,8)
WHERE j.name = @job_name

IF @minutes_running > @minutes_allowed 
    BEGIN
      SELECT @message_text = ('Job ' + UPPER(SUBSTRING(@job_name,1,LEN(@job_name))) + ' has been running for ' + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5)))) + ' minutes, which is over the allowed run time of ' + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) + ' minutes.') 
      EXEC msdb.dbo.sp_send_dbmail
        @recipients = @person_to_notify,
        @body = @message_text,
        @subject = 'Long-Running Job to Check' 
    END

此存储过程可以很容易地安排为SQL Server代理作业或必要的任何其它方法。它不采取任何行动,如果作业没有运行或者是指定的参数内运行。如果作业已经运行超过指定的时间越长,发送电子邮件。

e.g。

EXEC sp_check_job_running 'JobNameGoesHere', 5, 'admin@mycompany.com'

HT: HTTP://www.sqlserverspecialists。 co.uk/blog/_archives/2008/11/26/3996346.html

如果发现这个对sqlservercentral(它可能是一个较旧版本的SQL Server,但仍可能是相关的2008)

警报程序长时间运行的工作 http://www.sqlservercentral.com/scripts/Lock+and + +连接管理/ 30144 /

下的文字,如果你不能访问它。

对于定期运行,并应仅需很短的时间来运行的作业,一个DBA可能希望当作业已经运行了过多的时间就知道了。在这种情况下,只是检查,看看是否运行作业不会做;的能力,以确保它没有被运行很长一段时间是需要的。匹配的作业ID在sysprocess中进程id要求作业ID的一部分重新安排做匹配。此脚本创建一个存储过程,将接受一个作业名称,允许的最大运行时间,以及邮件地址来通知。然后,它会使用作业名重新串作业编号和校验的sysprocesses(基于进程ID是程序名称的一部分)来确定时间的工作已经乳宁的金额,然后警告如果时间超过“时间允许的”参数。

CREATE proc sp_check_job_running
    @job_name       char(50),
    @minutes_allowed    int,
    @person_to_notify   varchar(50)
AS  

DECLARE @var1           char(1),
    @process_id     char(8),
    @job_id_char        char(8),
    @minutes_running    int,
    @message_text       varchar(255)

select @job_id_char = substring(CAST(job_id AS char(50)),1,8) 
from  msdb..sysjobs
where name = @job_name

select @process_id =    substring(@job_id_char,7,2) + 
            substring(@job_id_char,5,2) +
            substring(@job_id_char,3,2) +
            substring(@job_id_char,1,2)


select @minutes_running = DATEDIFF(minute,last_batch, getdate())
from master..sysprocesses
where program_name LIKE ('%0x' + @process_id +'%')

if @minutes_running > @minutes_allowed
  BEGIN
    select @message_text = ('Job ' 
    + UPPER(SUBSTRING(@job_name,1,LEN(@job_name)))
    + ' has been running for '
    + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5))))
    + ' minutes, which is over the allowed run time of '
    + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) 
    + ' minutes.')
    EXEC master..xp_sendmail 
    @recipients = @person_to_notify, 
    @message = @message_text,
        @subject = 'Long-Running Job to Check'
  END

--  Typical job step syntax for job to do the checking

execute sp_check_job_running
      'JobThatSHouldBeDoneIn5Minutes', 
       5, 
       'DBAdmin@mycompany.com'

您可以使用监控软件,如 Nagios的定期算在你的数据库查询速度慢的数量。

我个人使用下面的查询与优良 PRTG 。我将其设置为我有超过5项的查询与执行时间每次给我一个电子邮件各自大于3秒,或当最慢查询超过10秒需要更长的时间:

SELECT total_elapsed_time / execution_count / 1000000 avg_elapsed_time, execution_count, creation_time, last_execution_time, 
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE total_elapsed_time / execution_count / 1000000 >= 3  -- filter queries that takes > 3 seconds
AND CHARINDEX('dm_exec_query_stats', st.text) = 0   -- In case this query is slow, we don't want it in the result set!
ORDER BY total_elapsed_time / execution_count DESC;

声明:本查询基于 https://stackoverflow.com/a/820252/638040

现在,如果你想监控你的存储过程,那么就使用sys.dm_exec_procedure_stats代替sys.dm_exec_sql_text(也请从选择现场creation_time和调整上st.text的子串)

您可以登录运行较慢的查询使用SQL事件探查器,但不会帮助你的警告,特别是。 (我想你可以记录到文件或数据库表,还有别的“倾听”并发出警报)。

如果你不熟悉SQL事件探查器这里的步骤:

您应该比服务器本身以外的东西上运行SQL事件探查器。

开始与SQLProfilerTSQL_Duration模板

设置过滤器:持续时间: “大于” 1000(milliseonds)

在过滤器可以限制数据库,登录,或如果必要的话类似。

在活动可以限制到只是存储过程(默认还包括SQL语句)

如果你是不是在找一个免费的解决方案,你可以看看 SQL哨兵。它做什么你问的多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top