【问题标题】:Creating a SQL Query to list Job failures within a 24hr period创建 SQL 查询以列出 24 小时内的作业失败
【发布时间】:2016-10-18 15:51:43
【问题描述】:

我需要帮助为 diff SQL Server 上大约 5/10 的作业创建针对“作业活动”的 SQL 查询。基本上我需要生成一个如下列表,每次显示以下作业时,我都需要进入作业活动,理想情况下,任何以名称“维护-备份..”开头,然后是以下列-启用/状态/上次运行结果/上一次运行/下一次运行

一旦我可以确定哪些作业已启用、已成功等。然后我会检查 24 小时内每个作业的历史记录,记下每个失败的时间和错误/原因。我有多个来自 Internet 的查询,这些查询为我提供了我正在寻找的详细信息,但我不确定如何重新排序代码/查询,只选择我需要的具体内容。

【问题讨论】:

  • 你试过什么?您能否发布一些代码,准确显示您遇到的问题?
  • link & link 是我一直在玩的两组代码
  • 在作业失败时将自己放在通知列表中。轻松愉快。
  • 谢谢 Michael,我已经询问了 DBA,但我有一种感觉,即使我收到这些警报,我仍然需要创建一个 Excel 文档,其中包含历史记录中的主要状态和故障。最终可能不得不通过电子邮件而不是 SQL DB。

标签: sql-server database android-activity jobs database-backups


【解决方案1】:

您可以从此代码创建一个视图并通过日期从中选择:

SELECT   Job.instance_id
    ,SysJobs.job_id
    ,SysJobs.name as 'JOB_NAME'
    ,SysJobSteps.step_name as 'STEP_NAME'
    ,Job.run_status
    ,Job.sql_message_id
    ,Job.sql_severity
    ,Job.message
    ,Job.exec_date
    ,Job.run_duration
    ,Job.server
    ,SysJobSteps.output_file_name
FROM    (SELECT Instance.instance_id
    ,DBSysJobHistory.job_id
    ,DBSysJobHistory.step_id
    ,DBSysJobHistory.sql_message_id
    ,DBSysJobHistory.sql_severity
    ,DBSysJobHistory.message
    ,(CASE DBSysJobHistory.run_status
        WHEN 0 THEN 'Failed'
        WHEN 1 THEN 'Succeeded'
        WHEN 2 THEN 'Retry'
        WHEN 3 THEN 'Canceled'
        WHEN 4 THEN 'In progress'
    END) as run_status
    ,((SUBSTRING(CAST(DBSysJobHistory.run_date AS VARCHAR(8)), 5, 2) + '/'
    + SUBSTRING(CAST(DBSysJobHistory.run_date AS VARCHAR(8)), 7, 2) + '/'
    + SUBSTRING(CAST(DBSysJobHistory.run_date AS VARCHAR(8)), 1, 4) + ' '
    + SUBSTRING((REPLICATE('0',6-LEN(CAST(DBSysJobHistory.run_time AS varchar)))
    + CAST(DBSysJobHistory.run_time AS VARCHAR)), 1, 2) + ':'
    + SUBSTRING((REPLICATE('0',6-LEN(CAST(DBSysJobHistory.run_time AS VARCHAR)))
    + CAST(DBSysJobHistory.run_time AS VARCHAR)), 3, 2) + ':'
    + SUBSTRING((REPLICATE('0',6-LEN(CAST(DBSysJobHistory.run_time as varchar)))
    + CAST(DBSysJobHistory.run_time AS VARCHAR)), 5, 2))) AS 'exec_date'
    ,DBSysJobHistory.run_duration
    ,DBSysJobHistory.retries_attempted
    ,DBSysJobHistory.server
    FROM msdb.dbo.sysjobhistory DBSysJobHistory
    JOIN (SELECT DBSysJobHistory.job_id
        ,DBSysJobHistory.step_id
        ,MAX(DBSysJobHistory.instance_id) as instance_id
        FROM msdb.dbo.sysjobhistory DBSysJobHistory
        GROUP BY DBSysJobHistory.job_id
        ,DBSysJobHistory.step_id
        ) AS Instance ON DBSysJobHistory.instance_id = Instance.instance_id
    WHERE DBSysJobHistory.run_status <> 1
    ) AS Job
JOIN msdb.dbo.sysjobs SysJobs
   ON (Job.job_id = SysJobs.job_id)
JOIN msdb.dbo.sysjobsteps SysJobSteps
   ON (Job.job_id = SysJobSteps.job_id AND Job.step_id = SysJobSteps.step_id)

【讨论】:

  • 这个查询似乎工作得很好! II 删除了一些不需要的部分(可能还有一些冗余代码)。有没有办法只显示以“维护 - 备份”开头的工作名称并添加额外的列 -
  • 对不起,我没有完成上面的评论......这个查询似乎工作得很好!不过我有点困惑,因为理想情况下我需要一个查询来向我显示当前的作业活动状态,然后另一个查询来进入每个活动的作业历史记录并检查过去 24 小时内的任何故障。这个查询似乎是第二部分,太棒了!我删除了一些不需要的部分(可能还有一些冗余代码)。有没有办法只显示作业名称以文本“维护 - 备份”开头的作业。我不需要修改这部分,因为它似乎工作正常
  • 这是我修改后的代码的link。非常感谢您的帮助!
  • 很高兴我能帮上忙。
【解决方案2】:

这是您需要的最近 24 小时的工作详细信息……否则无论如何它都会让您开始工作。

select
    j.name as JobName,
    j.enabled,
    j.date_created,
    a.start_execution_date,
    a.stop_execution_date,
    a.next_scheduled_run_date,
    h.run_date,
    h.run_time,
    case
        when h.run_status = 0 then 'Failed'
        when h.run_status = 1 then 'Succeeded'
        when h.run_status = 2 then 'Retry'
        when h.run_status = 3 then 'Canceled'
    end as LastRunOutcome
from 
    msdb.dbo.sysjobs j
    inner join msdb.dbo.sysjobactivity a on
    a.job_id = j.job_id
    inner join msdb.dbo.sysjobhistory h on
    h.job_id = j.job_id
    inner join
    (select job_id, max(run_date) dt
    from msdb.dbo.sysjobhistory
    group by job_id) h2 on h2.job_id = h.job_id and h2.dt = h.run_date
where
    cast(a.start_execution_date as date) = cast(getdate() as date)

【讨论】:

  • 这个查询给了我信息;消息 243,级别 16,状态 1,行 1 类型日期不是定义的系统类型。消息 243,级别 16,状态 1,行 1 类型日期不是定义的系统类型。
  • 它是 SQL Server,但我只能通过 Server Mgmt Studio 访问数据库
  • 不确定你有什么版本,但把底线从 cast 改为 convert 像这样...... convert(date,a.start_execution_date) = convert(date, getdate())
  • 我已经尝试过了,但不幸的是,我仍然收到了同样的信息。如果我从“where”开始删除底部的 2 行,则查询有效,但生成了一个包含数百个结果的列表,似乎信息太多。感谢您在这方面的帮助。
  • 嗯,这是零意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
  • 2015-09-19
相关资源
最近更新 更多