仅当 CPU 空闲时按计划运行服务器代理作业

c.d*_*lap 8 sql-server sql-server-agent

我在 SQL Server 代理中设置了一个作业来运行更新查询。我希望这项工作在每晚午夜和凌晨 5 点之间执行,并且我希望在该时间段内每 5 分钟重复一次。但我只希望在 CPU 空闲时实际执行作业,即 CPU 利用率低于 20%。我知道我可以设置时间表,也可以单独设置 CPU Idle 要求。有没有办法让我设置它,以便两个“时间表”都必须为真才能运行作业?

谢谢

小智 6

或者,您可以让一项每 5 分钟运行一次的作业分 2 个步骤:

第 1 步——检查 CPU 使用率(PowerShell),只要谷歌一下,那里就有很多脚本;如果 <20% 成功退出,请转到第 2 步,否则退出并出错并完成作业(无第 2 步)

步骤#2 -- 是实际的更新。

或者像肯建议的那样。

  • 我喜欢这个。我认为这是一个更好的解决方案。 (2认同)

c.d*_*lap 2

丹尼斯非常接近。但实际的解决方案稍有改变。由于powershell无法检查一段时间内的CPU,只能检查当前的使用情况,因此必须使用SQL Server检查。

因此,我的第一步工作是运行一个 PowerShell 脚本来检查当前系统时间是否在两个时间限制之间。如果是,则 powershell 脚本不执行任何操作。SQL Server 作业将此解释为成功。

然后作业进入最后一步并执行更新查询。

但是,如果当前时间超出范围,我会执行 aStart-Time -s 600将 powershell 脚本暂停 10 分钟(模拟“每 5 - 10 分钟一次”的要求)。这是为了防止 SQL Server 代理不断尝试运行此作业。

10 分钟后,powershell 脚本抛出自定义错误。由于我$ErrorActionPreference = "Stop"在脚本的开头有 powershell 脚本在错误后停止执行。这一步非常重要。

由于 powershell 已停止且未返回,因此 SQL Server 代理将此解释为失败,并且不会继续执行执行更新查询的步骤。

PS 你们带领我走向了正确的方向。如果我有足够的声誉,我会给你们投票。

编辑:添加了Powershell脚本

$ErrorActionPreference = "Stop"

$StartTime = Get-Date "12:00 AM"
$EndDate = Get-Date "05:00 AM"
$CurrentDate = Get-Date
$ExecuteJob = $StartTime -lt $CurrentDate -and $EndDate -gt $CurrentDate
if(!$ExecuteJob){    
    Start-Sleep -s 600
    throw "Current Time not within Server downtime"
}
Run Code Online (Sandbox Code Playgroud)