我在这里找到了这个有用的查询,我用它来监视 SQL Server 作业。
SELECT
sJobHis.[server],
sJobStep.database_name,
SJob.name,
SJob.enabled,
CASE WHEN SJob.enabled = 0 THEN '0'
WHEN sJobStep.subsystem = 'TSQL' AND sJobStep.command LIKE '%--%'
AND AVG(CAST(SUBSTRING(STUFF(
STUFF(RIGHT('000000' + CAST([sJobHis].[run_duration] AS VARCHAR(6)), 6)
, 3, 0, ':')
, 6, 0, ':') ,7,2) AS INT)) < 1 THEN '0'
WHEN sJobStep.subsystem = 'TSQL' AND sJobStep.command LIKE '%*/%'
AND AVG(CAST(SUBSTRING(STUFF(
STUFF(RIGHT('000000' + CAST([sJobHis].[run_duration] AS VARCHAR(6)), 6)
, 3, 0, ':')
, 6, 0, ':') ,7,2) AS INT)) < 1
THEN '0'
ELSE '1' END AS [ActiveStep],
sLogin.name [JobOwner],
sJobHis.step_id,
sJobHis.step_name,
sJobStep.subsystem AS [CommandType],
sJobStep.command AS [Command],
sJobHis.run_date,
[sJobSch].next_run_time AS [Scheduled_Time],
--sJobHis.run_time,
--sJobHis.run_duration,
AVG( CAST( SUBSTRING(STUFF(
STUFF(RIGHT('000000' + CAST([sJobHis].[run_duration] AS VARCHAR(6)), 6)
, 3, 0, ':')
, 6, 0, ':') ,4,2)AS INT))
AS [AvgRunDuration_In_Min],
AVG(CAST(SUBSTRING(STUFF(
STUFF(RIGHT('000000' + CAST([sJobHis].[run_duration] AS VARCHAR(6)), 6)
, 3, 0, ':')
, 6, 0, ':') ,7,2) AS INT))
AS [AvgRunDuration_In_Sec],
COUNT(*) AS [PerDay]
FROM sysjobs AS [SJob]
LEFT JOIN sysjobhistory AS [sJobHis] ON SJob.job_id = sJobHis.job_id
LEFT JOIN sysjobsteps AS [sJobStep] ON sJobHis.job_id = sJobStep.job_id AND sJobHis.step_id = sJobStep.step_id
INNER JOIN master.dbo.syslogins [sLogin] ON SJob.owner_sid = sLogin.sid
INNER JOIN dbo.sysjobschedules [sJobSch] ON SJob.job_id = [sJobSch].job_id
WHERE SJob.[enabled]=0 OR ( sJobHis.step_id > 0 AND (sJobHis.run_date > 20131002 AND sJobHis.run_date < 20131005))
GROUP BY sJobHis.[server],
sJobStep.database_name,
SJob.name,
SJob.enabled,
sLogin.name ,
sJobHis.step_id,
sJobHis.step_name,
sJobStep.subsystem ,
sJobStep.command ,
sJobHis.run_date,
[sJobSch].next_run_time
ORDER BY SJob.enabled DESC, SJob.name, sJobHis.run_date DESC
我喜欢全面了解我的服务器上发生的事情购买有两列对我来说毫无意义:
我希望有专栏Scheduled_Time
和Running_Time
更多的“人类可读性”,因为有时我无法弄清楚他们在说什么。
我有时会看到Scheduled_Time
as92000
或121200
,但我不知道那是什么意思。
Running_Time
有时显示120700
或的相同问题20000
。
不知道那是什么意思。
我不需要看到失败的工作
我已经拥有的查询是完美的,我只想将这两列格式化为更具可读性的输出
剧本很糟糕,来源……不是很权威。:/
为了公平对待您的问题,监控 SQL Server 代理作业并不像人们想象的那么简单,尽管查询作者怀疑人类可读时间。
由于目标是服务器的健康,因此请尝试将重点放在实际失败的作业上。关注平均值很好,但不是很有帮助,除非您是应用程序所有者并且您需要了解这些微小的细节。但即便如此,也要质疑请求以找出原因。
我偶然发现了一个出色的脚本,它可以让我找到每个失败的作业、失败的步骤以及在我们 200 多台服务器上报告的任何日志/消息。
返回的格式非常有见地:
请注意此输出的可读性。您不仅可以看到哪个作业失败了,还可以看到失败的 step_id!LogOutput 将返回错误,所有这些都是可操作的。
因为您以后可能会需要这个,所以我添加了另外两个有用的查询:
1. 查找错误日志位置 - 特别是当上述查询被截断时
2. 从 sys.dm_exec_requests 和 sys.dm_exec_sessions 中的 Program_Name 解析 Job
曾经想查看作业正在运行的会话及其请求吗?那么现在你可以通过一些脚本轻松地检查这个
- 预解决方案
只需解析 Program_Name 列以检索 Job_ID,并确保将其转换为 VARBINARY 形式。另请注意,您需要将转换类型指定为 1!
- 后解决方案
希望这能让您走得更远,并专注于可操作的信息。
它花了 1 年,但我有它。
我遵循了这个Microsoft 指南,我能够得到我想要的东西:我现在可以按日期、时间甚至持续时间过滤作业。
我保留了古老的行,这样你就可以看到我所做的改变。