担任 DBA 多年,但对 PowerShell 还不熟悉。我希望使用 PowerShell 循环遍历多个 SQL Server 实例,并找出过去 24 小时内失败的作业。即使作业随后成功运行,我也需要知道失败情况。现在我只想让它在一台服务器上运行,然后我会转到多台服务器上。
到目前为止,我所拥有的功能可以循环遍历所有作业,但我不确定如何获取过去 24 小时的执行状态:
$srv = New-Object "Microsoft.SqlServer.Management.Smo.Server" "localhost"
$jobs = $srv.JobServer.Jobs
foreach ($job in $jobs)
{
$jobHistory = $job.EnumHistory()
}
任何帮助都将不胜感激。我期待更多地了解 PowerShell,但现在,一些 SMO 有点令人困惑。
谢谢,丹
答案1
以下代码未经测试,但我认为它应该可以工作。
$jobs = $srv.JobServer.Jobs
$jhf = New-Object Microsoft.SqlServer.Management.Smo.Agent.JobHistoryFilter
$jhf.OutcomeTypes = [Microsoft.SqlServer.Management.Smo.Agent.CompletionResult]::Failed
foreach ($job in $jobs)
{
foreach ($jobRun in $job.EnumHistory($jhf) | where {$_.RunDate -gt ((Get-Date).AddDays(-1))})
{
$jobRun
}
}
编辑:在玩了 Shawn 的代码后,我稍微改变了一下。我更喜欢他访问 RunDate 的方法。
答案2
如果您使用的是 SQL Server 2008 或更高版本以及 SQLPS,则只需使用以下代码行(为便于阅读已拆分):\
编辑:已更正代码,以使用 EnumHistory,就像 @pk 一样,但在 SQLPS 中。所以这实际上只是一种替代方法。
dir SQLSERVER:\SQL\ServerName\DEFAULT\JobServer\Jobs | foreach {$_.EnumHistory()} |
where {$_.RunStatus -eq 0} | where {$_.RunDate -gt ((Get-Date).AddDays(-1))}
如果您正在运行 SQL 2005,则可以在服务器上安装 SQL Server 2008 R2 SQLPS。Microsoft 将其制成可再发行的软件包。Chad Miller 写了一篇很好的文章博客文章并提供模块的下载。