Job History

Overview

The Job History report lays out every SQL Agent job run for one day against the clock.

A list of job outcomes tells you what failed. A timeline tells you something a list cannot: what was running at the same time as what. Two jobs that each take twenty minutes are fine, and the same two jobs overlapping on a Sunday night are a different story.

The Job History report
One day at a time. Each run is a bar positioned by start time and sized by duration, coloured by outcome.

The page answers three questions:

  • What ran, and when. Position and length on the timeline.
  • What failed, and on which step. The grid drills into the steps of a run.
  • What overlapped. Vertical alignment on the timeline is the whole point of the shape.

Where to find it

Route How
Server tree Right-click the server → Instance ReportsJob History

The page title reads Job History for <server name>.


Requirements

  • Access to msdb, which is where SQL Agent writes its history. Membership of SQLAgentReaderRole or equivalent is enough to read other people’s jobs; without it you see only your own.
  • SQL Agent has to be installed and have run. Express editions have no Agent, so there is nothing to show.

Nothing is installed on the monitored instance and nothing is written.


Reading the timeline

The job timeline for one day
Vertical alignment is the whole point. Two jobs that each take twenty minutes are fine; the same two overlapping are a different story.

Each job run is a bar, positioned by start time and sized by duration, coloured by outcome.

Outcome Meaning
Succeeded The run completed.
Failed The run failed. The grid says which step.
Canceled Somebody or something stopped it.
Retry A step failed and was retried under its retry policy.

The counts for all four are shown for the day, so the timeline always has a total behind it.

Retry is its own outcome rather than being folded into failure. A step that failed and succeeded on retry is a different operational fact from one that failed outright, and a job that retries every night is telling you something even though it reports success.


Moving through days

Control What it does
< Prev Day Step back one day.
Next Day > Step forward one day.
Filter Jobs Narrow the timeline to the jobs you care about.

The page opens on today. One day at a time is deliberate: a timeline is only readable when the axis is short enough for a bar to have a meaningful width, and a week of job runs compressed onto one axis turns every overnight job into the same sliver.

Filter Jobs matters on instances with a lot of jobs. A busy Agent with fifty jobs produces a timeline nobody can read, and filtering to the maintenance jobs, or to one application’s jobs, puts the overlap question back within reach.


Reading the grid

Column What it is
Row The run, in order.
Job Step Which step of the job this row is.
Start When the step started.
Duration How long it took.
Outcome Succeeded, failed, canceled or retried.
The grid, one row per step
The grid is per step, not per job. A job that failed names the step it failed on.

The grid is per step. That is the difference between “the backup job failed” and “the backup job failed on step 3, the log backup, after the full backup succeeded”, which are the same row in most tools and two different mornings.


How to read the report

  1. Scan for colour first. Failures and cancellations are what you came for.
  2. Read the step, not the job. A multi-step job that fails on step 4 has already done steps 1 to 3, which changes what you need to rerun.
  3. Look at what overlaps a failure. A job that fails only when another one is running is a contention problem rather than a job problem.
  4. Watch the right-hand edge of your maintenance window. Jobs that used to finish inside it and now spill past are the ones that will fail later without ever changing.
  5. Step back through days when something is intermittent. One day proves nothing.

Common patterns

One job failing at the same time every night. Usually something else on the timeline at that moment. Look across, not down.

A maintenance window that has crept. Compare the same weekday across a few weeks with the day buttons. Growth is gradual and invisible day to day.

A job that succeeds but shows retries every run. It is failing and recovering. The success is real and so is the fragility.

A long bar with nothing else near it. Just a long job. Nothing here says that is wrong.

Nothing at all on a day. Either Agent was stopped, or msdb has trimmed that far back. See below.


Where the data comes from

msdb.dbo.sysjobhistory and sysjobs, which is where SQL Agent records what it did.

Agent trims its own history. The default is 1,000 rows overall and 100 rows per job, so a job that runs every few minutes can push a job that runs nightly out of history within days. If a day looks emptier than you expect, that is usually why rather than nothing having run. The limits are in SQL Agent properties, not in this report.

Nothing is stored by Database Health Monitor. This reads msdb live.


Report Why you would go there
Failed Jobs Just the failures, across the retention window, without the timeline.
Job Schedules What is supposed to run and when, rather than what did.
Backup Status Whether the backup jobs achieved anything, as opposed to whether they ran.
Blocking by Hour by Day Whether an overnight job is what the blocking pattern is about.
CPU by Hour by Day Whether the maintenance window is what the CPU shape is about.

Frequently asked questions

Why only one day at a time? Because a timeline needs a short enough axis for a bar to have a readable width. A week compressed onto one axis makes every overnight job the same sliver, which loses exactly the overlap the chart exists to show.

A day looks empty. Did nothing run? Check msdb retention before concluding that. SQL Agent trims history to 1,000 rows overall and 100 per job by default, and a frequently running job pushes everything else out.

Why is the grid per step rather than per job? Because which step failed decides what you have to rerun. A backup job that failed after the full succeeded is a different problem from one that failed before it.

What counts as a retry? A step that failed and was retried under the step’s own retry policy. It is shown separately because a job that quietly retries every night is worth knowing about even though it reports success.

Why can I not see other people’s jobs? Reading job history for jobs you do not own needs SQLAgentReaderRole in msdb or equivalent.

How is this different from Failed Jobs? Failed Jobs answers what failed. This answers what ran, when, alongside what, and on which step it went wrong.