msdb..sysjobactivity 中的 Oprhaned 条目

Pau*_*aul 5 sql-server sql-server-2008-r2 msdb

在这个问题中:https : //stackoverflow.com/questions/18445825/how-to-know-status-of-currently-running-jobs

提出了这个答案:

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
Run Code Online (Sandbox Code Playgroud)

但是,对于我的其中一台服务器,它有一个可追溯到 10 个月前的条目。查看 SQL 代理作业活动监视器显示没有正在运行的作业。查看 msdb..sysjobs 仅显示 3 个作业。谁能解释这个现象?

孤立行的 queued_date、stop_execution_date、job_history_id 和 next_scheduled_date 为 NULL。其余的值看起来合理。

Sim*_*wsi 8

StackOverflow 的答案有一个可能的解释:

/sf/ask/912636791/#13038752

报价:

每次 SQL 代理启动时,它都会在 syssessions 中放置一个新行,随后运行的任何作业都将在 sysjobactivity 中获得该 session_id。对于停止日期为空的作业,我的猜测是它们不适用于“当前”会话,这意味着它们在代理停止时仍在运行。

我有一个类似的问题,sysjobactivity 中的两个条目似乎“卡住了”,六周前的 start_execution_date 没有 stop_execution_date。按照上面引用中的建议,我检查了每个卡住记录的 session_id,发现在每种情况下卡住的记录都来自以前的会话。

以下 StackOverflow 答案显示了如何仅获取当前会话的活动:

/sf/answers/1264356551/

他们的代码:

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
Run Code Online (Sandbox Code Playgroud)


Pau*_*aul 2

谁知道!只需添加类似的东西

and sja.start_execution_date >= DATEADD(dd, -1, GETDATE())
Run Code Online (Sandbox Code Playgroud)

这是我目前在我的环境中的答案。这对我来说很有效,因为这是每天运行的更大脚本的一部分。确实感觉应该有更好的答案或解释。