SSIS工作时间表

时间:2014-10-23 20:52:54

标签: sql-server-2008 ssis

让我们说Job" Alphabet"完成任务A-Z。在15分钟内,该作业将在任务M中,或者换句话说,它将在15分钟内完成。 。在我的测试期间,我没有计划或一次运行,它运行并成功完成。然后我用调度程序运行"每天:每15米"。在这里使用调度程序,我看到作业永远不会击中Z或永远不会完成。 SQL代理是否停止实例并启动新实例?

2 个答案:

答案 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的窗口。

enter image description here

如果我查询我的观察表

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。