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),' ','0'),5,0,':'),3,0,':') as datetime) as job_start_datetime ,stuff(stuff(replace(str(jh.run_duration,6),' ','0'),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);
參考文檔: