sql-server - 如何在没有作业运行时自动停止 SQL Server 代理?

标签 sql-server jobs agent

我在一个实例中有大约 40 个不同的 sql server 作业。他们都有不同的时间表。有些每天运行一次,有些每两分钟运行一次,有些每五分钟运行一次。如果我需要停止 sql server agent,我如何找到没有作业运行的最佳时间,这样我就不会中断我的任何作业?

最佳答案

how can I find the best time when no jobs are running so I won't interrupt any of my jobs?

你基本上是想找一个好的窗口来进行一些维护。 @MaxVernon已经写了关于它的博客here用一个方便的脚本

/*
      Shows gaps between agent jobs
-- http://www.sqlserver.science/tools/gaps-between-sql-server-agent-jobs/
-- requires SQL Server 2012+ since it uses the LAG aggregate.
 Note: On SQL Server 2005, SQL Server 2008, and SQL Server 2008 R2, you could replace the LastEndDateTime column definition with:

       LastEndDateTime = (SELECT TOP(1) s1a.EndDateTime FROM s1 s1a WHERE s1a.rn = s1.rn - 1)
*/
DECLARE @EarliestStartDate DATETIME;
DECLARE @LatestStopDate DATETIME;
SET @EarliestStartDate = DATEADD(DAY, -1, GETDATE());
SET @LatestStopDate = GETDATE();
;WITH s AS 
(
    SELECT StartDateTime = msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time)
          , MaxDuration = MAX(sjh.run_duration)
    FROM msdb.dbo.sysjobs sj 
          INNER JOIN msdb.dbo.sysjobhistory sjh ON sj.job_id = sjh.job_id
    WHERE sjh.step_id = 0
        AND msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) >= @EarliestStartDate
        AND msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time) < = @LatestStopDate
    GROUP BY msdb.dbo.agent_datetime(sjh.run_date, sjh.run_time)
    UNION ALL
    SELECT StartDate = DATEADD(SECOND, -1, @EarliestStartDate)
        , MaxDuration = 1
    UNION ALL 
    SELECT StartDate = @LatestStopDate
        , MaxDuration = 1
)
, s1 AS 
(
SELECT s.StartDateTime
    , EndDateTime = DATEADD(SECOND, s.MaxDuration - ((s.MaxDuration / 100) * 100)
        + (((s.MaxDuration - ((s.MaxDuration / 10000) * 10000)) 
                    - (s.MaxDuration - ((s.MaxDuration / 100) * 100))) / 100) * 60
        + (((s.MaxDuration - ((s.MaxDuration / 1000000) * 1000000)) 
                    - (s.MaxDuration - ((s.MaxDuration / 10000) * 10000))) / 10000) * 3600, s.StartDateTime)
FROM s
)
, s2 AS
(
    SELECT s1.StartDateTime
        , s1.EndDateTime
        , LastEndDateTime = LAG(s1.EndDateTime) OVER (ORDER BY s1.StartDateTime)
    FROM s1 
)
SELECT GapStart = CONVERT(DATETIME2(0), s2.LastEndDateTime)
    , GapEnd = CONVERT(DATETIME2(0), s2.StartDateTime)
    , GapLength = CONVERT(TIME(0), DATEADD(SECOND, DATEDIFF(SECOND, s2.LastEndDateTime, s2.StartDateTime), 0))
FROM s2 
WHERE s2.StartDateTime > s2.LastEndDateTime
    ORDER BY s2.StartDateTime;

关于sql-server - 如何在没有作业运行时自动停止 SQL Server 代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40980339/

相关文章:

sql-server - 如何强制死锁来测试存储过程的try/catch?

sql-server - 脚本任务使用集成服务发布不支持的版本15.0

java - 如何使用 JobScheduler 为 Android 定期作业指定初始延迟?

php - 我可以在 Laravel 中处理作业超时吗?

python - Scrapy Shell - 如何更改 USER_AGENT

mysql - 按最大修订字符串分组

php - Laravel,dispatchAfterResponse 不释放前端请求

azure - 在自托管 Azure DevOps Agent 上安装 ChromeDriver

javascript - 使用简单反射代理的流行 'vaccumCleaner' 玩具问题解决方案

SQL Server : table variable used in a inner join