Agent Job 是SQL Server提供的自动管理工具,用户可以创建一个Job,设置Schedule,这样SQL Server Agent就会在指定的时间自动执行任务。一个任务可以是一段TSQL脚本,也可以是一个SSIS Package。SQL Server把Job每一次执行的历史信息存放在系统数据库msdb中。

Agent Job由Job Step,Schedule 和 Notification构成,本文简单介绍Job和Step的基本信息。

一,Agent Job的基本信息

Agent Job实际上是Job Step的容器,每一个Step都是一个待执行的任务,为了便于区分,Job的每一个Step都有一个编号,从1开始,依次递增。特殊地,step_id=0 代表Job的整体执行情况,Step名称为 (Job outcome)。

1,Job的基本信息

通过 msdb.dbo.sysjobs来查看Job的基本信息,第一个Step的ID是1,第一个开始运行的Step叫做Start Step,通常情况下,Start Step是从1 开始的。

select j.job_id
,j.name as job_name
,j.enabled
,j.description
,j.start_step_id
,j.date_created
,j.date_modified
from msdb.dbo.sysjobs j with(nolock)
where name =N'xxx'

2,Job Step的基本信息

通过msdb.dbo.sysjobsteps 来查看Step的基本信息,常用的字段:

  • subsystem:子系统的名称,常见的是TSQL 和 SSIS
  • command:子系统执行的命令
  • last_run_outcome:step上一次执行的结果,0 = Failed,1 = Succeeded,2 = Retry,3 = Canceled,5 = Unknown
  • last_run_duration :step上一次执行使用的时间,结果的格式是hhmmss
  • last_run_retries:step上一次重试的次数
  • last_run_date 和 last_run_time:step上一次开始执行的日期和时间,结果的格式分别是:yyyyMMdd 和 hhmmss

通过msdb.dbo.sysjobsteps 可以查看到上一次执行的状态:

select js.job_id
,js.step_id
,js.step_name
,js.subsystem
,js.command
,js.last_run_outcome
,case js.last_run_outcome
when 0 then 'Failed'
when 1 then 'Succeeded'
when 2 then 'Retry'
when 3 then 'Canceled'
else 'Unknown'
end as last_run_outcome_descr
,js.last_run_duration
,js.last_run_date
,js.last_run_time
,js.last_run_retries
from msdb.dbo.sysjobsteps js with(nolock)
where js.job_id=N'375ED3A3-97D5-4B10-924F-4E82C8F49B45'
and js.step_id=1

3,Job执行的历史消息

通过msdb.dbo.sysjobhistory来查看job step的历史消息,常用的字段:

  • instance_id:每一条记录都是一个实例
  • job_id和 step_id:job的id和step的id,注意 step_id=0表示整个Job
  • run_status:job step运行的状态,0 = Failed, 1 = Succeeded, 2 = Retry, 3 = Canceled, 4 = In Progress(很少存在run_status=4的情况)
  • run_date 和 run_time:job step运行的日期和时间,格式分别是:yyyyMMdd 和 hhmmss
  • run_duration:job step运行的总时间,格式是hhmmss

注意:在大多数情况下,正在执行的job step不会创建history instance,即msdb.dbo.sysjobhistory中很少存在run_status=4的情况。绝大多数情况下,只有job step运行完成之后,才会创建一个history instance。

查看Job Step运行的所有历史记录,每一个step都是一个实例(Instance),表示一条历史记录。

select jh.instance_id
,jh.job_id
,jh.step_id
,jh.step_name
,jh.message
,case jh.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
,jh.run_date
,jh.run_time
,jh.run_duration
from msdb.dbo.sysjobhistory jh with(nolock)
where job_id=N'375ED3A3-97D5-4B10-924F-4E82C8F49B45'
order by instance_id desc

二,Job History的查询

查看Job执行的历史记录

select jh.instance_id
,jh.job_id
,cast(stuff(stuff(str(jh.run_date,8),7,0,'-'),5,0,'-') + ' ' +
stuff(stuff(replace(str(jh.run_time,6,0),' ',''),5,0,':'),3,0,':')
as datetime) as job_start_datetime
,stuff(stuff(replace(str(jh.run_duration,6),' ',''),5,0,':'),3,0,':') as job_run_duration
,jh.step_id
,jh.step_name
,case jh.run_status
when 0 then 'failed'
when 1 then 'Succeeded'
when 2 then 'Retry'
when 3 then 'Canceled'
end as run_status
,jh.message
from msdb.dbo.sysjobhistory jh with(nolock)
where jh.job_id=N'375ED3A3-97D5-4B10-924F-4E82C8F49B45'
and jh.step_id=0 -- stand for job
order by jh.instance_id desc

三,记录Agent Job 的活动和状态

在启动SQL Server Agent时,Agent会新建一个Session,并把Session的ID存储到msdb.dbo.syssessions 中,该表记录的信息是Agent 创建的Session ID和Agent启动的时间。注意,只有在Agent关闭后,Agent重新启动时,才会新建Session。在Agent正常运行时,Agent运行Job是不会新建Session的。该Session ID是一个从1开始依次递增的整数,当前Agent可以用最大的SessionID来表示。

每当Agent执行一个job时,Agent都会把Session ID 和Job ID 写入到表 msdb.dbo.sysjobactivity 中,因此 msdb.dbo.sysjobactivity 记录当前Agent 正在运行的每一个Job的信息(Job开始执行的时间,执行成功的最后一个StepID....),如果要查看Agent当前执行的所有Job,那么 msdb.dbo.sysjobactivity的Session ID必须是当前Agent使用的SessionID,即表msdb.dbo.syssessions中最大的SessionID。

通过 msdb.dbo.sysjobactivity 查看当前Agent Job的活动和状态,关键字段:

  • session_id:Agent创建的Session ID
select j.job_id
,j.name as job_name
,iif( a.start_execution_date is not null and a.stop_execution_date is null, 'running' ,'not running') as run_status
from msdb.dbo.sysjobs j
inner join msdb.dbo.sysjobactivity a
on j.job_id = a.job_id
where session_id = ( select max(session_id) from msdb.dbo.sysjobactivity);

参考文档:

SQL Server Agent Tables (Transact-SQL)

查看Job执行的历史记录的更多相关文章

  1. 机器重启 查看crontab执行历史记录crontab没有执行

    Sep 17 19:01:01 d run-parts(/etc/cron.hourly)[8452]: finished 0anacronSep 17 19:10:01 d CROND[9059]: ...

  2. mysql查看正在执行的sql语句

    有2个方法: 1.使用processlist,但是有个弊端,就是只能查看正在执行的sql语句,对应历史记录,查看不到.好处是不用设置,不会保存. -- use information_schema; ...

  3. 两种方式:mysql查看正在执行的sql语句

    mysql查看正在执行的sql语句 2015年08月21日 17:32:59 阅读数:15398   有2个方法: 1.使用processlist,但是有个弊端,就是只能查看正在执行的sql语句,对应 ...

  4. Windows学习总结(8)——DOS窗口查看历史执行过的命令的三种方式

    在DOS窗口执行了一些列命令完成某项工作后,如果要查看都执行了那些命令,该如何办呢?(前提:DOS窗口未关闭的情况下) 一.方法一: 使用↑↓箭头上下翻看执行过的命令,此方式适宜执行命令较少的情况. ...

  5. 如何查看MySQL执行计划

    在介绍怎么查看MySQL执行计划前,我们先来看个后面会提到的名词解释: 覆盖索引: MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件 包含所有满足查询需要的数据的索引 ...

  6. 查看SQL执行计划

    一用户进入某界面慢得要死,查看SQL执行计划如下(具体SQL语句就不完全公布了,截断的如下): call     count       cpu    elapsed       disk       ...

  7. MSSQL优化之——查看语句执行情况

    MSSQL优化之——查看语句执行情况 在写SQL语句时,必须知道语句的执行情况才能对此作出优化.了解SQL语句的执行情况是每个写程序的人必不可少缺的能力.下面是对查询语句执行情况的方法介绍. 一.设置 ...

  8. 查看ORACLE执行计划的几种常用方法

    SQL的执行计划实际代表了目标SQL在Oracle数据库内部的具体执行步骤,作为调优,只有知道了优化器选择的执行计划是否为当前情形下最优的执行计划,才能够知道下一步往什么方向. 执行计划的定义:执行目 ...

  9. 查看Oracle执行计划的几种方法

    查看Oracle执行计划的几种方法 一.通过PL/SQL Dev工具 1.直接File->New->Explain Plan Window,在窗口中执行sql可以查看计划结果.其中,Cos ...

随机推荐

  1. git-简单流程(学习笔记)

    这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. ABP文档 - EntityFramework 集成

    文档目录 本节内容: Nuget 包 DbContext 仓储 默认仓储 自定义仓储 特定的仓储基类 自定义仓储示例 仓储最佳实践 ABP可使用任何ORM框架,它已经内置了EntityFrame(以下 ...

  4. PHP赋值运算

    1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...

  5. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  6. 用神奇的currentColor制作简洁的颜色动画效果

    先上一个兼容性总结图:老版本ie可以直接用复杂方法了,套用某表情包的话:  2016年了,做前端你还考虑兼容IE6?你这简直是自暴自弃! 好了,知道了兼容性,我们可以放心的使用了. 在CSS3中扩展了 ...

  7. Twproject Gantt开源甘特图功能扩展

    1.Twproject Gantt甘特图介绍 Twproject Gantt 是一款基于 jQuery 开发的甘特图组件,也可以创建其它图表,例如任务树(Task Trees).内置编辑.缩放和 CS ...

  8. Atitit 软件工程概览attilax总结

    Atitit 软件工程概览attilax总结 1.1. .2 软件工程的发展 进一步地,结合人类发展史和计算机世界演化史来考察软件工程的发展史. 表2 软件工程过程模型 表2将软件工程的主要过程模型做 ...

  9. Mono 3.2.3 Socket功能迎来一稳定的版本

    由于兴趣自己业余时间一直在搞.net下面的通讯应用,mono的存在得以让.NET程序轻松运行在Linux之下.不过经过多尝试Socket相关功能在Mono下的表现并不理想.不管性能还是吞吐能力方面离我 ...

  10. [httpserver]如何解析HTTP请求报文

    这个http server的实现源代码我放在了我的github上,有兴趣的话可以点击查看哦. 在上一篇文章中,讲述了如何编写一个最简单的server,但该程序只是接受到请求之后马上返回响应,实在不能更 ...