10

シナリオ

1 日を通して数分ごとに実行されるようにスケジュールされている特定の SQL エージェント ジョブがあります。

前のスケジュールからまだ実行されているため、次のスケジュールを逃す正当な時期があります。

時々、ジョブが「ハング」することがあります。これは失敗しません (ジョブがまだ停止していないため)。これが発生した場合、ジョブを手動で停止することができ、次回の実行時に正常に動作します。中断したところから再開するように設計されています。

一番効率の良い方法は…?

「JobX」という名前の SQL エージェント ジョブが現在実行されている時間を (秒単位で) 判断する方法が必要です。現在実行されていない場合は、ゼロを返すことができます。

このようにして、特定のしきい値を超えて実行されているジョブを停止できます。

xp_sqlagent_enum_jobs と sysjobhistory の組み合わせを使用できると思いますが、より良い解決策があるかどうかに興味があります...そして、残りの人が既に遭遇して回避した障害から利益を得ることができれば幸いです。

4

3 に答える 3

22

この解決策はうまくいきます:

SELECT DATEDIFF(SECOND,aj.start_execution_date,GetDate()) AS Seconds
FROM msdb..sysjobactivity aj
JOIN msdb..sysjobs sj on sj.job_id = aj.job_id
WHERE aj.stop_execution_date IS NULL -- job hasn't stopped running
AND aj.start_execution_date IS NOT NULL -- job is currently running
AND sj.name = 'JobX'
and not exists( -- make sure this is the most recent run
    select 1
    from msdb..sysjobactivity new
    where new.job_id = aj.job_id
    and new.start_execution_date > aj.start_execution_date
)

これは、システム テーブルに依存するより一般的なチェックです。カスタム ルートが必要な場合は、代わりに作成したジョブ ログ テーブルにジョブを挿入できます。

于 2012-05-23T19:45:46.940 に答える
1
/**** FOR CURRENTLY RUNNING JOBS ****/
SELECT j.name AS Job_Name,DATEDIFF(ss,a.start_execution_date ,GETDATE ())   
FROM msdb.dbo.sysjobactivity a INNER JOIN msdb.dbo.sysjobs j 
ON a.job_id =j.job_id
WHERE CONVERT(DATE,a.start_execution_date )=CONVERT(DATE,GETDATE ())
AND a.stop_execution_date IS NULL


/*This code will give u the Name of currently running jobs and for how much time it is running & after that u can add filters to it as u wish*/
/*Thanks in advance*/
于 2013-07-12T04:40:46.510 に答える