【问题标题】:How to mass update SQL Server Agent Job retry attempts based on Job name如何根据作业名称批量更新 SQL Server 代理作业重试尝试
【发布时间】:2019-08-29 16:14:49
【问题描述】:

我对运行 SQL 服务器比较陌生,需要一些帮助来完成我刚刚完成的任务。

我需要更新很多 SQL 代理作业,但不是全部。我只需要更新名称中包含特定单词的名称(例如“%Test%”)。 我需要在其中设置 2 项:重试次数(至 2 次)和重试间隔(至 10 分钟)。

因为这是一个生产服务器,我不能真正安装任何第三方程序或重新启动服务器,或类似的事情。我只能运行查询/存储过程。

服务器正在运行 Windows Server 2012 Standard 6.2 和 Microsoft SQL Server 2016 13.0.5366.0。我使用 TSQL 和 SSMS。

任何帮助将不胜感激!

编辑:

问题解决了。使用游标和存储过程 sp_update_jobstep 的组合。谢谢大家的帮助!

我为此编写的代码:

USE msdb ;  

DECLARE @jobname nvarchar (max);

DECLARE cursor_asd CURSOR
FOR SELECT 
  jb.name
FROM msdb.dbo.sysjobs jb
WHERE name like '%Delta%';

OPEN cursor_asd;

FETCH NEXT FROM cursor_asd INTO
    @jobname;

WHILE @@FETCH_STATUS = 0
    BEGIN

        Print @jobname
         EXEC dbo.sp_update_jobstep  
            @job_name = @jobname,  
            @step_id = 1,  
            @retry_attempts = 2,
            @retry_interval = 5 ;  

        FETCH NEXT FROM cursor_asd INTO
            @jobname;
    END;

CLOSE cursor_asd;
DEALLOCATE cursor_asd;

【问题讨论】:

  • 什么版本的 SQL Server?运行此查询以找出答案。选择@@版本
  • @Isaac Microsoft SQL Server 2016 13.0.5366.0 (X64) on Windows Server 2012 Standard 6.2

标签: sql-server tsql configuration automation windows-server-2012


【解决方案1】:

在每个单独的作业步骤中定义 SQL 代理作业的重试尝试。如果您的作业包含多个步骤,则必须确定要更新哪个步骤,除非您只是对所有步骤设置相同的重试。

这里基本上有两张桌子:

由于在每个单独的步骤中都定义了重试,因此您将在 [sysjobsteps] 中查看以下列:

  • retry_attempts - 步骤失败时重试的次数。
  • retry_interval - 重试尝试之间的等待时间(以分钟为单位)。

这是一个简单的查询,显示了如何连接这两个表并按作业名称过滤:

SELECT     [jbs].* --I'm just returning the job step columns here as an example
FROM       [msdb].[dbo].[sysjobs] [jb]
INNER JOIN [msdb].[dbo].[sysjobsteps] [jbs]
    ON [jbs].[job_id] = [jb].[job_id]
WHERE      [jb].[name] LIKE '%Test%' --Job Name Filter
           AND [jbs].[step_name] = 'JobStepName'; --Use this if needing to filter to a specific job step.

一旦我们让它返回我们想要更新的正确作业步骤,我们就可以轻松地将其转换为更新语句:

UPDATE     [jbs]
SET        [jbs].[retry_attempts] = '2'  --retry 2 times
         , [jbs].[retry_interval] = '10' --every 10 minutes
FROM       [msdb].[dbo].[sysjobs] [jb]
INNER JOIN [msdb].[dbo].[sysjobsteps] [jbs]
    ON [jbs].[job_id] = [jb].[job_id]
WHERE      [jb].[name] LIKE '%Test%' --Job Name Filter
           AND [jbs].[step_name] = 'JobStepName'; --Use this if needing to filter to a specific job step.

【讨论】:

    【解决方案2】:

    如果您使用的是 SQL Server 2016 或更高版本,则可以使用 sp_update_jobstep。在完成所有工作之前,请非常小心并彻底测试一些工作。

    【讨论】:

      【解决方案3】:

      查看其文档

      msdb.dbo.sp_update_jobstep

      link

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多