Encontrei esta consulta útil aqui e a uso para monitorar trabalhos do 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
Eu gosto de ter uma visão geral do que está acontecendo no meu servidor, compre duas colunas que não significam nada para mim:
Eu gostaria de ter as colunas Scheduled_Time
e Running_Time
mais "legíveis para humanos", pois às vezes não consigo descobrir o que eles estão dizendo.
Às vezes eu vejo Scheduled_Time
como 92000
ou 121200
e não tenho ideia do que isso significa.
Mesmo problema com o Running_Time
qual às vezes mostra 120700
ou 20000
.
Não tenho ideia do que isso significa.
Eu não preciso ver os trabalhos com falha
A consulta que já tenho está perfeita, só quero formatar essas duas colunas em uma saída mais legível
O roteiro é terrível e a fonte... não tinha muita autoridade. :/
Para ser justo com sua pergunta, monitorar trabalhos do SQL Server Agent não é tão simples quanto se poderia pensar, embora o tempo legível por humanos seja suspeito do autor das consultas.
Como o objetivo é a saúde do servidor, tente focar em um dos trabalhos que estão realmente falhando. Concentrar-se nas médias é bom, mas não é muito útil, a menos que você seja o proprietário do aplicativo e precise conhecer esses detalhes minuciosos. Mas mesmo assim, desafie o pedido para descobrir o porquê.
Me deparei com um excelente script que me permite encontrar todos os trabalhos com falha, a etapa em que falhou e todos os logs/mensagens relatados em nossos mais de 200 servidores .
O formato retornado é muito perspicaz:
Observe como essa saída é legível. Você pode não apenas ver qual tarefa está falhando, mas também o step_id em que ela falhou! O LogOutput retornará o erro, tudo isso acionável .
Como você provavelmente desejará isso mais tarde, adicionei duas outras consultas que são úteis:
1. Encontre o local do log de erros - especialmente quando as consultas acima são truncadas
2. Analise o trabalho de Program_Name em sys.dm_exec_requests e sys.dm_exec_sessions
Sempre quis ver as sessões em que um trabalho está sendo executado e suas solicitações? bem, agora você pode verificar isso facilmente através de alguns scripts
- Pré-Solução
Apenas analise a coluna Program_Name para recuperar o Job_ID e certifique-se de convertê-lo para o formulário VARBINARY. Observe também que você precisa especificar o tipo de conversão para 1!
- Pós-Solução
Espero que isso o leve muito mais à frente e se concentre em informações acionáveis .
Demorou 1 ano, mas eu tenho.
Segui este Guia da Microsoft e consegui o que queria: agora posso filtrar o trabalho por data , hora e até duração .
Eu mantive as fileiras antigas para que você possa ver a mudança que fiz.