Поделиться через


Как определить, что в данный момент делает Job (ru-RU)

Вся информация о Job`ах хранится в системной БД msdb. Например весь их перечень находится в таблице msdb.dbo.sysjobs.
Ход выполнения конкретного джоба можно отслеживать через системные представления, при этом не только отслеживая, когда и под кем он был запущен, а так же кто его блокирует в данный момент и даже текущий запрос, который выполняется в этом джобе.

select   j.name       -- Имя задания
     , r.session_id -- Идентификатор сеанса, к которому относится данный запрос
     , r.start_time -- Временная метка поступления запроса
     , r.status     -- Состояние запроса
     , r.blocking_session_id -- Идентификатор сеанса, блокирующего данный запрос
     , r.wait_time -- Если запрос в настоящий момент блокирован, 
                 -- в столбце содержится продолжительность текущего ожидания (в миллисекундах)
     , r.cpu_time  -- Процессорное время (в миллисекундах), затраченное на выполнение запроса
     , r.total_elapsed_time -- Общее время, истекшее с момента поступления запроса (в миллисекундах)
     , r.reads              -- Число операций чтения, выполненных данным запросом
     , r.writes             -- Число операций записи, выполненных данным запросом
     , r.logical_reads      -- Число логических операций чтения, выполненных данным запросом
     , t.text               -- Текст SQL-запроса
  from sys.dm_exec_requests r
    inner join sys.dm_exec_sessions s
      on r.session_id = s.session_id
    cross apply sys.dm_exec_sql_text ( sql_handle ) t
    inner join msdb.dbo.sysjobs j
      on s.program_name like '%' + master.dbo.fn_varbintohexstr( j.job_id ) + '%'
  where j.name = N'Имя задания'

Определить текущий статус задания через EP (Extended Stored Procedure):

declare @xp_results table ( [Job ID]                uniqueidentifier
                           ,[Last Run Date]         int
                           ,[Last Run Time]         int
                           ,[Next Run Date]         int
                           ,[Next Run Time]         int
                           ,[Next Run Schedule ID]  int
                           ,[Requested To  Run]      int
                           ,[Request Source]        int
                           ,[Request Source ID]     nvarchar(128)                                                 
                           ,[Running]               int    
                           ,[Current Step]          int
                           ,[Current Retry Attempt] int
                           ,[State]                 int
                          )
insert into  @xp_results
exec master.dbo.xp_sqlagent_enum_jobs 1, sa 
 
select s.name
     , state = case x.[State] 
                  when 0 then 'Cостояние бездействия или приостановки'
                  when 1 then 'Выполняется'
                  when 2 then 'Ожидание потока'
                  when 3 then 'Ожидание повторной попытки'
                  when 4 then 'Бездействие'
                  when 5 then 'Приостановлен'
                  when 7 then 'Выполняеются завершающие действия'
               end
  from @xp_results x 
    inner join msdb.dbo.sysjobs s 
      on x.[Job ID] = s.job_id
  where s.name = N'Имя задания'

Вариант для SQL Server 2005 и выше.