poniedziałek, 8 listopada 2010

status joba


Joby jak wiadomo są sekwencyjne więc nawet jeżeli zrobimy joba i będziemy go  uruchamiać co kilka sekund a czas jego wykonania będzie dłuższy to następne wywołanie z harmonogramu zostaną pominięte do czasu aż skończy się poprzednie wywołanie.
Jeżeli przed wywołaniem „joba B” chcemy mieć pewność że „job A” się zakończył, możemy ich uruchomienie włożyć do „jobaC” jako kolejne kroki

Krok 1
EXEC MSDB.DBO.SP_START_JOB @JOB_NAME = 'job A'

Krok 2

EXEC MSDB.DBO.SP_START_JOB @JOB_NAME = 'job B'


Można też w pierwszym kroku „joba B „ sprawdzać czy „job A” działa, procedura w prosty sposób zwraca aktualny stan joba.

CREATE PROC rk_status_job @job_name varchar(200)
as
declare     @job_id UNIQUEIDENTIFIER
DECLARE @job_owner sysname

SELECT @job_id =job_id,@job_owner=s.name FROM msdb..sysjobs_view v
INNER JOIN  sys.syslogins s
ON v.owner_sid =s.sid

       DECLARE @xp_results TABLE (job_id                UNIQUEIDENTIFIER NOT NULL,
                  last_run_date         INT              NOT NULL,
                  last_run_time         INT              NOT NULL,
                  next_run_date         INT              NOT NULL,
                  next_run_time         INT              NOT NULL,
                  next_run_schedule_id  INT              NOT NULL,
                  requested_to_run      INT              NOT NULL,
                  request_source        INT              NOT NULL,
                  request_source_id     sysname          COLLATE database_default NULL,
                  running               INT              NOT NULL,
                  current_step          INT              NOT NULL,
                  current_retry_attempt INT              NOT NULL,
                  job_state             INT              NOT NULL)
                                 
            INSERT INTO @xp_results
            EXECUTE master.dbo.xp_sqlagent_enum_jobs 1,'sa',@job_id
            SELECT @job_name job,
            status =case running
               when 0 then 'Not idle'
               when 1 then 'Executing'
               when 2 then 'Waiting for thread'
               when 3 then 'Between retries'
               when 4 then 'Idle'
               when 5 then 'Suspended'
               when 7 then 'Performing completion actions'
               ELSE '???'
            END,
            running status_id
            FROM @xp_results
Wywołanie

EXEC rk_status_job 'job A

--------------------

job                       status         status_id
--------------------------------------- -----------
job A                     Not idle       0


4 komentarze:

  1. Można też użyć bardzo dobrej procedury sp_help_job. Ma ona ciekawe możliwości filtrowania jobów i wyświetlania sporej ilości szczegółów n/t stepów. Polecam.

    OdpowiedzUsuń
  2. @brejk ona korzysta z procedury sp_get_composite_job_info a ta z xp_sqlagent_enum_jobs ;)
    czyli to samo żródło...

    OdpowiedzUsuń
  3. @roku: Wiem, też używam xp_sqlagent_enum_jobs, jeśli tylko sprawdzam statusy jobów, choć nie przepadam za nieudokumentowanymi procedurami :-) Choć ostatnio sp_help_job przydaje mi się bardziej, gdy szukam okazji do optymalizacji (czasy wykonania poszczególnych stepów).

    OdpowiedzUsuń
  4. dokładnie tak jak ja tylko że procedura na wyjscu ma duzo danych, pisanie tempa za każdym razem mnie denerwowało dlatego zrobilem raz w procedurze, no może dwa bo mam tez funkcję która sprawdza czy dany job jest uruchomiony i wtedy daje if

    OdpowiedzUsuń