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. ArcGIS 10.0紧凑型切片读写方法

    首先介绍一下ArcGIS10.0的缓存机制: 切片方案 切片方案包括缓存的比例级别.切片尺寸和切片原点.这些属性定义缓存边界的存在位置,在某些客户端中叠加缓存时匹配这些属性十分重要.图像格式和抗锯齿等 ...

  2. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

  3. 前端HTML5几种存储方式的总结

    接下来要好好总结一些知识,秋招来啦...虽然有好多知识都不大会,但是还是要努力一下,运气这种东西,谁知道呢~ 总体情况 h5之前,存储主要是用cookies.cookies缺点有在请求头上带着数据,大 ...

  4. iOS:以前笔记,未整理版。太多了,先放着吧。。。。。。。

    1. -(void)timetick { _d = 0; NSTimer *newtime =[NSTimer scheduledTimerWithTimeInterval:1 target:self ...

  5. 对Maven、gradle、svn、spring 3.0 fragment、git的想法

    1.Maven Maven可以构建项目,采用pom方式配置主项目和其他需要引用的项目.同时可结合spring3.0的新特性web  fragment. 从现实出发,特别是对于管理不到位,程序员整体素质 ...

  6. Struts的拦截器

    Struts的拦截器 1.什么是拦截器 Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所 ...

  7. Spring MVC入门

    1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...

  8. ASP.NET 5 (vNext) Linux部署

    引言 工欲善其事,必先利其器. 首先,我们先明确下以下基本概念 Linux相关 Ubuntu Ubuntu是基于linux的免费开源桌面PC操作系统 十分契合英特尔的超极本定位 支持x86.64位和p ...

  9. .NET - 基于事件的异步模型

    注:这是大概四年前写的文章了.而且我离开.net领域也有四年多了.本来不想再发表,但是这实际上是Active Object模式在.net中的一种重要实现方法,因此我把它掏出来发布一下.如果该模型有新的 ...

  10. 我认为JS还可以改进的点

    曾经我一度在寻找JS的替代语言,尝试过CoffeeScript/TypeScript/Dart(都是浅尝).不为什么原因,而是当你写的越多的JS,越觉得JS很多时候显得很操蛋.好在ES2015和Bab ...