Agent 第一篇:Job 基礎


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); 

 

 

參考文檔:

SQL Server Agent Tables (Transact-SQL)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM