【问题标题】:SSIS job scheduleSSIS 工作计划
【发布时间】:2014-10-23 20:52:53
【问题描述】:

假设 Job “Alphabet” 执行 A-Z 任务。在 15 分钟后,该作业将进入任务 M,或者换句话说,它不会在 15 分钟内完成。 .在我的测试期间,我没有计划或一次性运行,它运行并成功完成。然后我使用“每天:每 15m”的调度程序运行。在这里使用调度程序,我看到工作永远不会达到 Z 或永远不会完成。 SQL 代理是否正在停止实例并启动一个新实例?

【问题讨论】:

  • 您是在暗示 sql 代理是作业调度程序吗?
  • 嗯,我不认为我使用了工作代理这个词。但是..是的。
  • 也许我误解了你的问题。它只有 SSIS 标记,而 SSIS 没有内置的调度程序。因此,我假设您使用的是外部调度程序,除非另有说明,否则人们通常使用 SQL Agent for SSIS。所以,既然你理解了我的假设,我不清楚你到底在问什么。问题是“sql agent 会开始下一次作业迭代”还是“sql agent 是否支持趋势分析来确定作业是否在运行的内部/外部公差”等
  • 我明白了。我很抱歉。我编辑了问题。

标签: sql-server-2008 ssis


【解决方案1】:

这是一个很容易自己测试的方法。在下文中,我通过一个步骤创建了一个 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 代理已经在运行,它将不会启动该作业。如果您尝试手动运行它

作业“重叠执行”启动失败。 运行作业重叠执行的请求(来自用户 pity\dafool​​)被拒绝,因为该作业已根据用户 mr\T 的请求运行。 (Microsoft SQL Server,错误:22022)

相反,代理将跳过错过的启动,直到它能够真正启动。在这里你可以看到历史。 4点50分开始。错过了 4:51 的开始,因为它已经在运行但抓住了 4:52 的窗口。

如果我查询我的 watchme 表

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),您应该能够预测它在进程中的位置以及任何失败信息。

【讨论】:

    【解决方案2】:

    添加一个 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。

    【讨论】:

    • 我知道这是怎么回事。我只是想要一个是/否的答案。但是,这也很有帮助。我测试了这个东西。它永远不会结束。但想确定一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多