Rau*_*DBA 4 sql-server sql-server-agent jobs scheduled-tasks sql-server-2014
我有一个关于工作统计的问题。因此,我有一份具有以下时间表的工作:每天在上午 12:00:00 到晚上 11:59:59 之间每 5 分钟发生一次。时间表将于 2017 年 12 月 13 日开始使用。
在 2019-10-20 上午 11:27 我运行了两个脚本来获取 last_run_time 和 next_run_time,下面是脚本及其对应的结果:
USE msdb
GO
SELECT J.Name AS 'Job Name'
,'Job Enabled' =
CASE J.Enabled
WHEN 1 THEN 'Yes'
WHEN 0 THEN 'No'
END
,STUFF(
STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-')
, 8, 0, '-') AS 'Job Schedule Start Date'
,STUFF(
STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-')
, 8, 0, '-') AS 'Job Schedule End Date'
,'Job Frequency' =
CASE S.freq_type
WHEN 1 THEN 'Once'
WHEN 4 THEN 'Daily'
WHEN 8 THEN 'Weekly'
WHEN 16 THEN 'Monthly'
WHEN 32 THEN 'Monthly relative'
WHEN 64 THEN 'When SQLServer Agent starts'
END
,'Last Run Date' = CONVERT(DATETIME, RTRIM(LASTRUN.run_date) + ' '
+ STUFF(STUFF(REPLACE(STR(RTRIM(LASTRUN.run_time), 6, 0),
' ', '0'), 3, 0, ':'), 6, 0, ':'))
, 'Last Run Status' =
CASE
WHEN LASTRUN.run_status = 0 THEN 'Failed'
WHEN LASTRUN.run_status = 1 THEN 'Succeeded'
WHEN LASTRUN.run_status = 2 THEN 'Retry'
WHEN LASTRUN.run_status = 3 THEN 'Cancelled'
ELSE 'Unknown'
END
,'Last Run Message' = LASTRUN.message
FROM dbo.sysjobs J
LEFT OUTER JOIN dbo.sysjobschedules JS
ON J.job_id = JS.job_id
LEFT OUTER JOIN dbo.sysschedules S
ON JS.schedule_id = S.schedule_id
LEFT OUTER JOIN (SELECT
job_id
,MAX(run_duration) AS RUN_DURATION
FROM dbo.sysjobhistory
GROUP BY job_id) MAXDUR
ON J.job_id = MAXDUR.job_id
LEFT OUTER JOIN (SELECT
J1.job_id
,J1.RUN_DURATION
,J1.run_date
,J1.run_time
,J1.message
,J1.run_status
FROM dbo.sysjobhistory J1
WHERE instance_id = (SELECT
MAX(instance_id)
FROM dbo.sysjobhistory J2
WHERE J2.job_id = J1.job_id)) LASTRUN
ON J.job_id = LASTRUN.job_id
ORDER BY 'Job Name'
Run Code Online (Sandbox Code Playgroud)
use msdb
go
Select [job name] = jb.name
, [schedule name] = sc.name
, [next run date] = js.next_run_date
, [next run time] = js.next_run_time
From dbo.sysjobs as jb
Inner Join dbo.sysjobschedules as js on js.job_id = jb.job_id
Inner Join dbo.sysschedules as sc on js.schedule_id = sc.schedule_id
Run Code Online (Sandbox Code Playgroud)
因此,根据图片 next_run_date 应该是上午 11:30 而不是上午 11:15。你有没有遇到过这种现象?你能帮我理解这个吗?
sysjobschedules 上的文档显示里面的数据每 20 分钟刷新一次。
注意: sysjobschedules 表每 20 分钟刷新一次,这可能会影响 sp_help_jobschedule 存储过程返回的值。
这就是为什么您的next_run_date&next_run_time列可能会显示过时的数据。
他谈到使用dbo.sysjobactivity.
您可以使用next_scheduled_run_date,这是此 dmv 中的日期时间列。
示例查询:
SELECT sj.Name,
next_scheduled_run_date
FROM msdb.dbo.sysjobs sj
JOIN msdb.dbo.sysjobactivity sja
ON sj.job_id = sja.job_id
WHERE session_id = (
SELECT MAX(session_id) FROM msdb.dbo.sysjobactivity);
Run Code Online (Sandbox Code Playgroud)
使用 是max(session)因为代理每次重新启动时都会启动一个新会话。
这导致
Name next_scheduled_run_date
LSAlert_My_machine 2019-10-20 11:34:00.000
LSRestore_My_machine_Test42 2019-10-20 11:45:00.000
LSCopy_My_machine_Test42 2019-10-20 11:45:00.000
syspolicy_purge_history 2019-10-21 02:00:00.000
Run Code Online (Sandbox Code Playgroud)
安全管理系统
在调用作业活动监视器时跟踪 SSMS 正在做什么以获取作业信息。last_run_date & last_run_timexp_sqlagent_enum_jobs以游标方式从过程中获取。
您可以使用此程序获取工作信息并将光标置于其上。
获取一项工作的信息的示例:
DECLARE @job_id uniqueidentifier
DECLARE @job_owner varchar(255)
SELECT @job_owner = SUSER_SNAME()
SELECT @job_id=job_id FROM msdb..sysjobs
WHERE name = 'LSAlert_My_machine'
EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id;
Run Code Online (Sandbox Code Playgroud)
程序返回的第 2 到第 5 列:
Last Run Date Last Run Time Next Run Date Next Run Time
20191020 114400 20191020 114600
Run Code Online (Sandbox Code Playgroud)
如果您希望为所有作业运行该过程:
DECLARE @job_id uniqueidentifier, @job_name varchar(255)
DECLARE @job_owner varchar(255)
SELECT @job_owner = SUSER_SNAME()
DECLARE @xp_results TABLE(Job_name varchar(255),Job_Id varbinary(16),last_run_date varchar(10),last_run_time varchar(10),next_run_date varchar(10), next_run_time varchar(10), next_run_schedule_id int, requested_to_run bit,request_source int, request_source_id int, running bit, current_step int, current_retry_attempt int, [State] int)
DECLARE C CURSOR FAST_FORWARD READ_ONLY FOR
SELECT [name],job_id FROM msdb..sysjobs
OPEN C
FETCH NEXT FROM C INTO @job_name,@job_id
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @xp_results(Job_Id,last_run_date ,last_run_time ,next_run_date , next_run_time , next_run_schedule_id , requested_to_run ,request_source , request_source_id , running , current_step , current_retry_attempt , [State] )
EXECUTE master.dbo.xp_sqlagent_enum_jobs 1, @job_owner, @job_id;
UPDATE @xp_results
SET Job_name = @job_name
WHERE Job_Id = @job_id;
FETCH NEXT FROM C INTO @job_name,@job_id
END
CLOSE C
DEALLOCATE C
SELECT Job_name,last_run_date,last_run_time,next_run_date,next_run_time
FROM @xp_results;
Run Code Online (Sandbox Code Playgroud)
示例输出
Job_name last_run_date last_run_time next_run_date next_run_time
LSAlert_My_machine 20191020 115800 20191020 120000
LSCopy_My_machine_Test42 20191020 114500 20191020 120000
LSRestore_My_machine_Test42 20191020 114500 20191020 120000
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |