我想实现一个“作业超时报警”功能,如果某个job超过2小时,那就自动发送email给我,否则还需要人工去查
大家有没有经验?
谢谢!!

解决方案 »

  1.   

    在前台程序中用个timer来解决.
      

  2.   

    因为job是sql server自动按排程运行的,并不是前台程序调用的,所以似乎不能解决
    可以通过master.dbo.xp_sqlagent_enum_jobs来知道当前某个job正在运行,但没办法知道这个job是什么时候开始的
      

  3.   

    执行不成功的话发通知肯定是可以的
    现在的情况是一个job执行了太久(比如几天),这样的job不算失败,也没有事件可以触发通知
    后面几栏上只有上次执行时间和下次执行时间,对于当前正在执行的job没有时间显示
      

  4.   

    --> 简单起见,以下代码并不能直接使用:select * from (exec master..xp_sqlagent_enum_jobs 1,'sa')
    where Running = 1 --当前正在运行的作业
    --运行时间超过120分钟
    and datediff(minute,ltrim([Next Run Date])+' '+ltrim([Next Run Time]/10000)+':'+ltrim([Next Run Time]%10000/100)+':'+ltrim([Next Run Time]%100),getdate())>120/*xp_sqlagent_enum_jobs 对正在运行的作业,即使跨越了调度间隔,也不会刷新 Next Run Date 和 Next Run Time,所以它们就是当前运行作业的开始日期和时间。这两个字段都是整型,Next Run Date比较好理解;
    Next Run Time = hour * 10000 + minute * 100 + second*/
      

  5.   

    另外,存储过程 msdb.dbo.sp_get_composite_job_info 中有一段代码,创建一个临时表 #xp_results 接收 xp_sqlagent_enum_jobs 的结果集,可以直接拿来用。
      

  6.   

    你可以再建一个job,每15分钟运行一次,去检查msdb.sysjobhisotry里面相关job的完成情况,
    如果超过一定时间还没有读到完成的时间,就发邮件。
      

  7.   

    对于周期性执行的job, 它的next run就是job执行开始的时候(如果job正在run的话)目前我们公司的job监控主要就是使用这种时间确定方法
      

  8.   

    另外, 如果 job 有多个步骤, 每个步骤执行完成后都会写 msdb.dbo.sysjobhistory 这张表
    但 job 的状态会是正在运行(run_status=4, job 的状态是 stepid = 0 的那条记录)
    所以如果你要保证时间最准确的话, 你可以为每个 job 多建立一个空步骤(即这个步骤什么都不做, 放在job的第一步)
    由于第1步不花时间, 所以 job 一运行, 第1步就完成了, msdb.dbo.sysjobhistory 中就有 job 正在运行的记录, 并且可以查到开始时间这种方法应该算是最准确的, 但由于要求每个 job 第1步都是一个空步骤, 所以这要看你的公司的规范是否允许了