让我们说Job" Alphabet"完成任务A-Z。在15分钟内,该作业将在任务M中,或者换句话说,它将在15分钟内完成。 。在我的测试期间,我没有计划或一次运行,它运行并成功完成。然后我用调度程序运行"每天:每15米"。在这里使用调度程序,我看到作业永远不会击中Z或永远不会完成。 SQL代理是否停止实例并启动新实例?
答案 0 :(得分:2)
这是一个很容易自己测试的人。在下面,我创建一个SQL代理作业,只有一个步骤,如果它不存在,则在tempdb中创建一个表。
然后在插入当前时间戳之前等待90秒。但是,它计划每分钟运行一次。
USE [msdb]
GO
DECLARE @jobId binary(16)
EXEC msdb.dbo.sp_add_job
@job_name = N'Overlapping Execution'
, @enabled = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 0
, @category_name = N'[Uncategorized (Local)]'
, @job_id = @jobId OUTPUT
SELECT
@jobId
GO
EXEC msdb.dbo.sp_add_jobserver
@job_name = N'Overlapping Execution'
, @server_name = N'localhost\DEV2014'
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_add_jobstep
@job_name = N'Overlapping Execution'
, @step_name = N'Insert into table'
, @step_id = 1
, @cmdexec_success_code = 0
, @on_success_action = 1
, @on_fail_action = 2
, @retry_attempts = 0
, @retry_interval = 0
, @os_run_priority = 0
, @subsystem = N'TSQL'
, @command = N'USE tempdb
GO
IF NOT EXISTS
(
SELECT * FROM sys.tables AS T WHERE T.name = ''WatchMe''
)
BEGIN
CREATE TABLE dbo.Watchme
(
StartTime datetime NOT NULL
);
END
GO
-- wait for 90 seconds to ensure overlap
WAITFOR DELAY ''00:01:30'';
-- Add a row so we can demonstrate activity
INSERT INTO
dbo.Watchme
(
StartTime
)
VALUES
(CURRENT_TIMESTAMP);
'
, @database_name = N'tempdb'
, @flags = 0
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_update_job
@job_name = N'Overlapping Execution'
, @enabled = 1
, @start_step_id = 1
, @notify_level_eventlog = 0
, @notify_level_email = 2
, @notify_level_netsend = 2
, @notify_level_page = 2
, @delete_level = 0
, @description = N''
, @category_name = N'[Uncategorized (Local)]'
, @notify_email_operator_name = N''
, @notify_netsend_operator_name = N''
, @notify_page_operator_name = N''
GO
USE [msdb]
GO
DECLARE @schedule_id int
EXEC msdb.dbo.sp_add_jobschedule
@job_name = N'Overlapping Execution'
, @name = N'EveryMinute'
, @enabled = 1
, @freq_type = 4
, @freq_interval = 1
, @freq_subday_type = 4
, @freq_subday_interval = 1
, @freq_relative_interval = 0
, @freq_recurrence_factor = 1
, @active_start_date = 20141023
, @active_end_date = 99991231
, @active_start_time = 0
, @active_end_time = 235959
, @schedule_id = @schedule_id OUTPUT
SELECT
@schedule_id
GO
那么,会发生什么?如果SQL Agent已在运行,则它不会启动该作业。如果您尝试手动运行它
作业'重叠执行'开始失败。 请求运行作业重叠执行(来自User pity \ dafool)被拒绝,因为作业已经从User mr \ T的请求运行。 (Microsoft SQL Server,错误:22022)
相反,代理将跳过错过的开始,直到它能够实际开始。在这里你可以看到历史。它从4:50开始。错过了4:51的开始,因为它已经在运行,但却抓住了4:52的窗口。
如果我查询我的观察表
SELECT
WM.*
FROM
dbo.WatchMe AS WM
ORDER BY
1
我可以看到是的,我的插入时间大约是工作开始后的90秒。
StartTime
2014-10-23 16:51:30.277
2014-10-23 16:53:30.767
2014-10-23 16:55:30.790
2014-10-23 16:57:30.793
2014-10-23 16:59:30.870
不,代理不会停止当前正在执行的作业来启动它的新实例。
打开你的软件包中的日志记录(我喜欢SQL Server并记录OnPre / PostExecute,OnError,OnTaskFailed),你应该能够在过程中找到它的位置以及任何失败信息。
答案 1 :(得分:0)
添加AA步骤,检查作业是否已在运行。
SELECT sj.name FROM msdb.dbo.sysjobactivity sja
INNER JOIN msdb.dbo.sysjobs sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
AND sja.stop_execution_date IS NULL
AND name = 'Alphabet'
如果是,请跳过步骤A-Z。