web-dev-qa-db-fra.com

Entrées orphelines dans msdb..sysjobactivité

Dans cette question: https://stackoverflow.com/questions/184445825/how-to-knking-statut-of-curquemment-running-jobs

Cette réponse a été proposée:

SELECT sj.name
   , sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
   AND sja.stop_execution_date IS NULL

Cependant, pour l'un de mes serveurs, cela a une entrée en arrière il y a 10 mois. En regardant dans SQL Agent Job Activity Monitor affiche aucun emploi en cours d'exécution. En regardant dans msdb..sysjobs montre un simple travail d'emploi. Quelqu'un peut-il expliquer ce phénomène?

La rangée orpheline a des nuls pour filed_date, stop_execution_date, job_history_id et next_scheduld_date_date. Le reste des valeurs a l'air raisonnable.

5
Paul

Qui sait! Juste ajouter quelque chose comme

and sja.start_execution_date >= DATEADD(dd, -1, GETDATE())

Ceci est ma réponse actuelle dans mon environnement. Cela fonctionne pour moi comme le plus grand script que cela fait partie des courses quotidiennement. Il se sent comme une meilleure réponse ou une meilleure explication devrait être disponible.

2
Paul

Une réponse StackoverFlow a une explication possible:

https://stackoverflow.com/questions/13037668/What-Does-it-Mean-a-have-jobs-with-a-null-stop-date/13038752#13038752

Citer:

Chaque fois que l'agent SQL commence, il met une nouvelle ligne dans SysSessions puis toute exécution des travaux obtiendra cette session_id dans la sysjobactivité. Pour vos emplois qui ont une date d'arrêt NULL, je suppose que ce ne sont pas pour la session "actuelle" qui signifierait qu'ils fonctionnaient toujours lorsque l'agent a été arrêté.

J'ai eu un problème similaire où deux entrées de sysjobactivité semblaient être "bloquées", avec un fichier start_execution_date de six semaines de retour et aucun stop_execution_date. Suite à la suggestion dans la citation ci-dessus, j'ai vérifié la session_id pour chacun de ces enregistrements bloqués et trouvé dans chaque cas, les enregistrements bloqués étaient des sessions précédentes.

La réponse Stackoverflow suivante montre comment obtenir uniquement l'activité de la session en cours:

https://stackoverflow.com/a/18062236/21644

Leur code:

SELECT
    job.name, 
    job.job_id, 
    job.originating_server, 
    activity.run_requested_date, 
    DATEDIFF( SECOND, activity.run_requested_date, GETDATE() ) as Elapsed
FROM 
    msdb.dbo.sysjobs_view job
JOIN
    msdb.dbo.sysjobactivity activity
ON 
    job.job_id = activity.job_id
JOIN
    msdb.dbo.syssessions sess
ON
    sess.session_id = activity.session_id
JOIN
(
    SELECT
        MAX( agent_start_date ) AS max_agent_start_date
    FROM
        msdb.dbo.syssessions
) sess_max
ON
    sess.agent_start_date = sess_max.max_agent_start_date
WHERE 
    run_requested_date IS NOT NULL AND stop_execution_date IS NULL
8
Simon Tewsi