如何有效地记录SQL Server代理作业

时间:2017-09-06 20:47:03

标签: sql-server scheduled-tasks database-administration sql-agent-job

我的团队几乎都是全新的,我们继承了几个自动化工作,我们很少或根本没有文档(工作描述中也没有)。我们有数百个在SQL Server代理和各种服务器上运行的自动化作业,因此我想开始记录一些基本信息(这些作业何时安排?他们通常需要多长时间?,他们多久失败一次?,是执行时间长度是静态还是在增长?如果是SSIS包,它位于何处以及它做了什么?如果是报告,是否可以迁移到SSRS调度程序?)。

我们在该地区有一所大学,询问我们是否可以利用任何实习生。虽然我们有大量工作,但我们无法向非员工授予对敏感数据的访问权限。我正在考虑将数据库恢复到另一台服务器并截断敏感数据表,使系统数据库保持原状,以便记录计划任务。我不确定这是一个好主意,因为我可能会花费尽可能多的时间“保护”数据,因为实际任务需要完成。有没有人对这类问题有任何创造性的解决方案?

可能是这样的:

http://bradsruminations.blogspot.com/2011/04/documenting-your-sql-agent-jobs.html http://www.elsasoft.org/forum/topic.asp?TOPIC_ID=164

我希望听到其他人已经克服了这些挑战的反馈意见。感谢您的帮助!!!

3 个答案:

答案 0 :(得分:0)

所有这些信息都由MSSQL存储在表中,您可以查询这些系统表以检索信息以下内容适用于SQL 2012以后,您可以使用下面的列表来查询作业,计划等。现在MSDN将要在这里做你的朋友。

  • dbo.sysalerts:每个警报都包含一行。
  • dbo.syscategories:包含SQL Server使用的类别 Management Studio用于组织工作,警报和操作员。
  • dbo.sysdownloadlist:保留所有人的下载说明队列 目标服务器。
  • dbo.sysjobactivity:包含有关当前SQL Server的信息 代理工作活动和状态。
  • dbo.sysjobhistory:包含有关执行的信息 SQL Server代理安排的作业。
  • dbo.sysjobs:存储每个预定作业的信息 由SQL Server代理执行。
  • dbo.sysjobschedules:包含作业的计划信息 由SQL Server代理
  • 执行
  • dbo.sysjobservers:存储a的关联或关系 使用一个或多个目标服务器的特定工作。
  • dbo.sysjobsteps:包含作业中每个步骤的信息 由SQL Server代理执行。
  • dbo.sysjobstepslogs:包含有关作业步骤日志的信息。
  • dbo.sysnotifications:每个通知都包含一行。
  • dbo.sysoperators:每个SQL Server代理运营商都包含一行。
  • dbo.sysproxies:包含有关SQL Server代理代理的信息 帐户。
  • dbo.sysproxylogin:记录与哪些SQL Server登录相关联 每个SQL Server代理代理帐户。
  • dbo.sysproxysubsystem:记录哪个SQL Server代理子系统 每个代理帐户使用。
  • dbo.sysschedules:包含有关SQL Server代理作业的信息 时间表。
  • dbo.syssessions:包含每个SQL的SQL Server代理开始日期 服务器代理会话。每次SQL Server都会创建一个会话 代理服务开始。
  • dbo.syssubsystems:包含有关所有可用SQL Server的信息 代理代理子系统。
  • dbo.systargetservergroupmembers:记录目标服务器 目前已加入此多服务器组。
  • dbo.systargetservergroups:记录目标服务器组 目前已加入此多服务器环境。
  • dbo.systargetservers:记录当前目标服务器 加入此多服务器操作域。
  • dbo.systaskids:包含之前创建的任务的映射 当前版本的SQL Server到Management Studio作业 版本

BIG CAVEAT:如果该作业运行SQL脚本,这不会告诉您作业会发生什么。您需要查看脚本中的作业decypher,然后再添加说明。这就是为什么你勤奋并且第一次注意细节。

答案 1 :(得分:0)

我在以下博客的帮助下提出了用于记录工作信息的脚本。我进行了一些修改,并且正在应用过滤器以获取有关特定作业的详细信息。

https://mikesdatawork.wordpress.com/2015/06/30/convert-last_run_date-and-last_run_time-in-sysjobsteps/#comment-2720

http://bradsruminations.blogspot.com/2011/04/documenting-your-sql-agent-jobs.html

DECLARE @job_name sysname = 'YourJobNameHere'
SELECT 'Job Detailed Information' AS TypeofData
;WITH job_details AS
(
SELECT j.name
, j.job_id
, jb.step_id
, jb.step_name
,jb.subsystem
, jb.command
,jb.additional_parameters 
--, 'last run literal' = dateadd(millisecond, jb.last_run_time,convert(datetime,cast(nullif(jb.last_run_date,0) as nvarchar(10))))
, 'last run day' = datename(dw, dateadd(millisecond, jb.last_run_time,convert(datetime,cast(nullif(jb.last_run_date,0) as nvarchar(10)))))
, 'last run date' = convert(char, dateadd(millisecond, jb.last_run_time,convert(datetime,cast(nullif(jb.last_run_date,0) as nvarchar(10)))), 9)
FROM dbo.sysjobs as j 
INNER JOIN dbo.sysjobsteps as jb
ON j.job_id = jb.job_id
WHERE j.name = @job_name
)
SELECT * FROM job_details order by step_id ;
SELECT 'Schedule Detailed Information' AS TypeofData;
WITH job_schedules AS
(
select schedule_id
      ,sysschedules.name as schedule_name
      ,SchedDesc=TimeOfDay+Frequency+EffDtRange   
from dbo.sysschedules 
cross apply 
  --Translate the dates and times into DATETIME values
  --And translate the times into HH:MM:SSam (or HH:MMam) strings
  (select StDate=convert(datetime
                        ,convert(varchar(8),active_start_date))
         ,EnDate=convert(datetime
                        ,convert(varchar(8),active_end_date))
         ,StTime=convert(datetime
                        ,stuff(stuff(right(1000000+active_start_time
                                          ,6)
                                    ,3,0,N':')
                              ,6,0,N':'))
         ,EnTime=convert(datetime
                        ,stuff(stuff(right(1000000+active_end_time
                                          ,6)
                                    ,3,0,N':')
                              ,6,0,N':'))
  ) F_DtTm
cross apply
  --Translate the times into appropriate HH:MM:SSam or HH:MMam char formats
  (select replace(replace(replace(substring(lower(convert(varchar(30),StTime,109))
                                           ,13,14)
                                 ,N':000',N'')
                         ,N':00a',N'a')
                 ,N':00p',N'p')
         ,replace(replace(replace(substring(lower(convert(varchar(30),EnTime,109))
                                           ,13,14)
                                 ,N':000',N'')
                         ,N':00a',N'a')
                 ,N':00p',N'p')
  ) F_Tms(StTimeString,EnTimeString)
cross apply 
  --What Time of Day? Single Time or Range of Times/Intervals
  (select case 
            when freq_subday_type=0
            then N''
            else case 
                   when freq_subday_type=1
                   then N'At '
                   else N'Every '
                       +convert(nvarchar(10),freq_subday_interval)
                       +' '
                       +case freq_subday_type
                          when 2 then N'Second'
                          when 4 then N'Minute'
                          when 8 then N'Hour'
                        end
                       +case 
                          when freq_subday_interval=1 then N'' else N's' end
                       +N' From '
                 end
                +StTimeString
                +case
                   when freq_subday_type=1
                   then N''
                   else N' to '+EnTimeString
                 end
                +N' '
          end
  ) F_Tm(TimeOfDay)
cross apply
  --Translate Frequency  
  (select case freq_type
            when 1
            then N'One Time Only'
            when 4
            then N'Every '
                +case freq_interval 
                   when 1
                   then N'Day'
                   else convert(nvarchar(10),freq_interval)+N' Days'
                 end
            when 8
            then N'Every '
                +case freq_recurrence_factor
                   when 1
                   then N''
                   else convert(nvarchar(10),freq_recurrence_factor)+N' Weeks on '
                 end
                +stuff(case when freq_interval& 1<>0 then N', Sunday' else N'' end
                      +case when freq_interval& 2<>0 then N', Monday' else N'' end
                      +case when freq_interval& 4<>0 then N', Tuesday' else N'' end
                      +case when freq_interval& 8<>0 then N', Wednesday' else N'' end
                      +case when freq_interval&16<>0 then N', Thursday' else N'' end
                      +case when freq_interval&32<>0 then N', Friday' else N'' end
                      +case when freq_interval&64<>0 then N', Saturday' else N'' end
                      ,1,2,N'')
            when 16
            then N'Every '
                +case freq_recurrence_factor 
                   when 1
                   then N'Month '
                   else convert(nvarchar(10),freq_recurrence_factor)+N' Months '
                 end
                +N'on the '
                +convert(nvarchar(10),freq_interval)
                +case 
                   when freq_interval in (1,21,31)
                   then N'st'
                   when freq_interval in (2,22)
                   then N'nd'
                   when freq_interval in (3,23)
                   then N'rd'
                   else N'th'
                 end
                +N' of the Month'
            when 32
            then N'Every '
                +case freq_recurrence_factor 
                   when 1
                   then N'Month '
                   else convert(nvarchar(10),freq_recurrence_factor)+N' Months '
                 end
                +N'on the '
                +case freq_relative_interval 
                   when  1 then N'1st '
                   when  2 then N'2nd '
                   when  4 then N'3rd '
                   when  8 then N'4th '
                   when 16 then N'Last '
                 end
                +case freq_interval 
                   when  1 then N'Sunday'
                   when  2 then N'Monday'
                   when  3 then N'Tuesday'
                   when  4 then N'Wednesday'
                   when  5 then N'Thursday'
                   when  6 then N'Friday'
                   when  7 then N'Saturday'
                   when  8 then N'Day'
                   when  9 then N'Weekday'
                   when 10 then N'Weekend Day'
                 end
                +N' of the Month'
            when 64
            then N'When SQL Server Agent Starts'
            when 128
            then N'Whenever the CPUs become Idle'
            else N'Unknown'
          end
  ) F_Frq(Frequency)
cross apply
  --When is it effective?
  (select N' (Effective '+convert(nvarchar(11),StDate,100)
         +case  
            when EnDate='99991231'
            then N''
            else N' thru '+convert(nvarchar(11),EnDate,100)
          end
         +N')'           
  ) F_Eff(EffDtRange)
WHERE schedule_id IN (SELECT s.schedule_id 
FROM dbo.sysjobschedules as s
INNER JOIN dbo.sysjobs as j 
on j.job_id = s.job_id 
WHERE j.name = @job_name)
)
SELECT * FROM job_schedules;

答案 2 :(得分:-1)

我自己从未使用过此工具,但我听说过 Dataedo 的一些好消息。 https://dataedo.com/