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 -- 是实际的更新。
或者像肯建议的那样。
丹尼斯非常接近。但实际的解决方案稍有改变。由于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)
归档时间: |
|
查看次数: |
4483 次 |
最近记录: |