我的团队几乎都是全新的,我们继承了几个自动化工作,我们很少或根本没有文档(工作描述中也没有)。我们有数百个在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
我希望听到其他人已经克服了这些挑战的反馈意见。感谢您的帮助!!!
答案 0 :(得分:0)
所有这些信息都由MSSQL存储在表中,您可以查询这些系统表以检索信息以下内容适用于SQL 2012以后,您可以使用下面的列表来查询作业,计划等。现在MSDN将要在这里做你的朋友。
BIG CAVEAT:如果该作业运行SQL脚本,这不会告诉您作业会发生什么。您需要查看脚本中的作业decypher,然后再添加说明。这就是为什么你勤奋并且第一次注意细节。
答案 1 :(得分:0)
我在以下博客的帮助下提出了用于记录工作信息的脚本。我进行了一些修改,并且正在应用过滤器以获取有关特定作业的详细信息。
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/