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. webapi - 使用依赖注入

    本篇将要和大家分享的是webapi中如何使用依赖注入,依赖注入这个东西在接口中常用,实际工作中也用的比较频繁,因此这里分享两种在api中依赖注入的方式Ninject和Unity:由于快过年这段时间打算 ...

  2. C语言 · 最大值与最小值计算

    输入11个整数,计算它们的最大值和最小值. 样例输入 0 1 2 3 4 5 6 7 8 9 10 样例输出 10 0   #include<stdio.h> int main(){ ]; ...

  3. [版本控制之道] Git 常用的命令总结(欢迎收藏备用)

    坚持每天学习,坚持每天复习,技术永远学不完,自己永远要前进 总结日常开发生产中常用的Git版本控制命令 ------------------------------main-------------- ...

  4. iOS系列文章

    本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...

  5. 和 Thrift 的一场美丽邂逅

    一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...

  6. Xamarin+Prism开发详解五:页面布局基础知识

    说实在的研究Xamarin到现在,自己就没设计出一款好的UI,基本都在研究后台逻辑之类的!作为Xamarin爱好者,一些简单的页面布局知识还是必备的. 布局常见标签: StackLayout Abso ...

  7. MCDownloadManager ios文件下载管理器

    我们用AFNetworking小试牛刀,写一个简单的下载器来演示功能. 前言 为什么AFNetworking能够成为顶级框架?我们究竟该如何领悟它的精髓所在?这都是很难的问题.安全,高效,流畅,这3个 ...

  8. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  9. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  10. Struts2日期类型转换

    针对日期类java.util.Date进行类型转换,要求客户端使用"yyyy-MM-dd","yyyy/MM/dd"中的任意一种输入,并以"yyyy- ...