You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何测量MS SQL作业运行时长并在超时时中止重启同运行步骤

MS SQL作业超时自动重启实现方案

方案1:SQL Agent原生配置(最简便,无需额外代码)

无需开发额外逻辑,直接通过SQL Server自带的作业配置即可实现需求,操作步骤如下:

  • 打开SQL Server Management Studio,找到对应作业右键选择「属性」
  • 切换到「步骤」标签,选中需要监控的执行步骤,点击「编辑」
  • 在弹出的步骤编辑窗口,切换到「高级」标签页
  • 找到「执行超时值(秒)」选项,填入1800(对应30分钟,默认值0表示无超时限制)
  • 下方「重试次数」填写需要的重启上限,例如填3表示最多自动重试3次,「重试间隔(分钟)」可按需求设置,比如填1表示失败后间隔1分钟再重试
  • 逐层确认保存所有配置即可生效
    说明:此方案直接调用SQL Agent原生超时终止、失败重试逻辑,完全匹配需求,稳定性最高

方案2:自定义监控脚本(适合需要额外日志、自定义判断逻辑的场景)

如果需要记录超时事件、配合其他业务逻辑做联动,可以用自定义存储过程+独立监控作业的方式实现。

第一步:创建超时监控存储过程

USE msdb
GO
-- 可选:先建超时日志表用于记录异常事件
CREATE TABLE IF NOT EXISTS dbo.JobTimeoutLog(
    Id INT IDENTITY(1,1) PRIMARY KEY,
    JobName NVARCHAR(128) NOT NULL,
    TimeoutTime DATETIME NOT NULL DEFAULT GETDATE(),
    RunDuration INT NOT NULL -- 超时实际运行时长,单位秒
)
GO

CREATE PROC dbo.MonitorLongRunningJob
AS
BEGIN
    SET NOCOUNT ON
    -- 替换为你实际要监控的作业名称
    DECLARE @TargetJobName NVARCHAR(128) = N'你的作业名称'
    -- 最大允许运行时长,单位秒,此处设置为30分钟
    DECLARE @MaxAllowDuration INT = 1800
    DECLARE @TargetJobId UNIQUEIDENTIFIER
    DECLARE @CurrentRunDuration INT

    -- 获取目标作业ID
    SELECT @TargetJobId = job_id FROM sysjobs WHERE name = @TargetJobName
    IF @TargetJobId IS NULL RETURN

    -- 查询正在运行的目标作业的已运行时长
    SELECT 
        @CurrentRunDuration = DATEDIFF(SECOND, ja.start_execution_date, GETDATE())
    FROM sysjobactivity ja
    WHERE ja.job_id = @TargetJobId
        AND ja.stop_execution_date IS NULL
        AND ja.start_execution_date IS NOT NULL

    -- 运行时长超过阈值则终止并重启动作业
    IF @CurrentRunDuration > @MaxAllowDuration
    BEGIN
        -- 终止超时运行的作业
        EXEC dbo.sp_stop_job @job_name = @TargetJobName
        -- 等待10秒确保作业资源完全释放
        WAITFOR DELAY '00:00:10'
        -- 重新启动作业
        EXEC dbo.sp_start_job @job_name = @TargetJobName
        -- 记录超时日志
        INSERT INTO dbo.JobTimeoutLog(JobName, RunDuration)
        VALUES(@TargetJobName, @CurrentRunDuration)
    END
END
GO

第二步:配置定时监控作业

  • 新建一个独立的SQL Agent作业,命名为「长运行作业监控」
  • 新增一个TSQL执行步骤,执行语句为EXEC dbo.MonitorLongRunningJob
  • 设置该监控作业的执行计划为每5分钟运行一次,如果需要更高的监控精度可调整为每1分钟运行一次
    说明:使用该方案时需要将原作业的步骤超时设置为0(无限制),由监控脚本统一控制超时逻辑

内容的提问来源于stack exchange,提问作者Eivind Hauger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:27:00