SQL Server 作业监控
在讲解SQLServer Agent Jobs之前,先要讲解msdb。
Msdb是SQLServer的系统数据库之一,用于存储SQLServer的配置、元数据等信息。包括:
l SQLServer Agent Jobs,Job Steps,Job schedules,Alerts,Operators,等等。
l Service Broker,Log Shipping,Backups/restore信息,维护计划、数据库邮件、基于策略管理信息等等。
l SSIS包。
在这部分,主要集中在msdb的以下部分:
l Job setup/configuration Information
l Job Execution Information
l Job Step(s) Setup/Configuration Information
l Job Step(s) Execution Information
l Schedule Information
————————————————————————————————————————————————————————————————————————————
SQLServer 允许在Replication,SSIS,存储过程,批处理上创建和执行各种自动化任务。允许使用GUI 或者T-SQL脚本创建。这些信息存储在msdb中。SQL Server Agent Job Setup andConfiguration Information:
可以在SSMS中执行以下脚本查找作业信息:
SELECT [sJOB].[job_id] AS [作业ID] ,
[sJOB].[name] AS [作业名称] ,
[sDBP].[name] AS [作业创建者] ,
[sCAT].[name] AS [作业种类] ,
[sJOB].[description] AS [作业描述] ,
CASE [sJOB].[enabled]
WHEN 1 THEN '已启用'
WHEN 0 THEN '未启用'
END AS [是否启用] ,--
[sJOB].[date_created] AS [作业创建日期] ,
[sJOB].[date_modified] AS [作业最后修改日期] ,
[sSVR].[name] AS [作业运行服务器] ,
[sJSTP].[step_id] AS [作业起始步骤] ,
[sJSTP].[step_name] AS [步骤名称] ,
CASE WHEN [sSCH].[schedule_uid] IS NULL THEN '否'
ELSE '是'
END AS [是否分布式作业] ,
[sSCH].[schedule_uid] AS [分布式作业ID] ,
[sSCH].[name] AS [用户定义名称] ,
CASE [sJOB].[delete_level]
WHEN 0 THEN '不删除'
WHEN 1 THEN '成功后删除'
WHEN 2 THEN '失败后删除'
WHEN 3 THEN '完成时删除'
END AS [完成时删除作业级别]
FROM [msdb].[dbo].[sysjobs] AS [sJOB]
LEFT JOIN [msdb].[sys].[servers] AS [sSVR] ON [sJOB].[originating_server_id] = [sSVR].[server_id]
LEFT JOIN [msdb].[dbo].[syscategories] AS [sCAT] ON [sJOB].[category_id] = [sCAT].[category_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sJSTP] ON [sJOB].[job_id] = [sJSTP].[job_id]
AND [sJOB].[start_step_id] = [sJSTP].[step_id]
LEFT JOIN [msdb].[sys].[database_principals] AS [sDBP] ON [sJOB].[owner_sid] = [sDBP].[sid]
LEFT JOIN [msdb].[dbo].[sysjobschedules] AS [sJOBSCH] ON [sJOB].[job_id] = [sJOBSCH].[job_id]
LEFT JOIN [msdb].[dbo].[sysschedules] AS [sSCH] ON [sJOBSCH].[schedule_id] = [sSCH].[schedule_id]
ORDER BY [作业名称]
SQL Server Agent Job Execution Information:
SQLServer同时存放作业执行信息在msdb中。可以执行以下脚本查询作业执行情况:
SELECT [sJOB].[job_id] AS [作业ID] ,
[sJOB].[name] AS [作业名] ,
CASE WHEN [sJOBH].[run_date] IS NULL
OR [sJOBH].[run_time] IS NULL THEN NULL
ELSE CAST(CAST([sJOBH].[run_date] AS CHAR(8)) + ' '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([sJOBH].[run_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6, 0, ':') AS DATETIME)
END AS [最近执行时间] ,
CASE [sJOBH].[run_status]
WHEN 0 THEN '失败'
WHEN 1 THEN '成功'
WHEN 2 THEN '重试'
WHEN 3 THEN '取消'
WHEN 4 THEN '正在运行' -- In Progress
END AS [最近执行状态] ,
STUFF(STUFF(RIGHT('000000'
+ CAST([sJOBH].[run_duration] AS VARCHAR(6)), 6), 3,
0, ':'), 6, 0, ':') AS [LastRunDuration (HH:MM:SS)] ,
[sJOBH].[message] AS [最近运行状态信息] ,
CASE [sJOBSCH].[NextRunDate]
WHEN 0 THEN NULL
ELSE CAST(CAST([sJOBSCH].[NextRunDate] AS CHAR(8)) + ' '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([sJOBSCH].[NextRunTime] AS VARCHAR(6)),
6), 3, 0, ':'), 6, 0, ':') AS DATETIME)
END AS [下次运行时间]
FROM [msdb].[dbo].[sysjobs] AS [sJOB]
LEFT JOIN ( SELECT [job_id] ,
MIN([next_run_date]) AS [NextRunDate] ,
MIN([next_run_time]) AS [NextRunTime]
FROM [msdb].[dbo].[sysjobschedules]
GROUP BY [job_id]
) AS [sJOBSCH] ON [sJOB].[job_id] = [sJOBSCH].[job_id]
LEFT JOIN ( SELECT [job_id] ,
[run_date] ,
[run_time] ,
[run_status] ,
[run_duration] ,
[message] ,
ROW_NUMBER() OVER ( PARTITION BY [job_id] ORDER BY [run_date] DESC, [run_time] DESC ) AS RowNumber
FROM [msdb].[dbo].[sysjobhistory]
WHERE [step_id] = 0
) AS [sJOBH] ON [sJOB].[job_id] = [sJOBH].[job_id]
AND [sJOBH].[RowNumber] = 1
ORDER BY [作业名]
SQL Server Anget Job Steps Setup andconfiguration Information:
在作业系统中,一个作业是有层级的,可以包含一个或多个步骤。
运行以下脚本查看作业步骤信息:
SELECT [sJOB].[job_id] AS [作业ID] ,
[sJOB].[name] AS [作业名] ,
[sJSTP].[step_uid] AS [步骤ID] ,
[sJSTP].[step_id] AS [步骤序号] ,
[sJSTP].[step_name] AS [步骤名] ,
CASE [sJSTP].[subsystem]
WHEN 'ActiveScripting' THEN 'ActiveX Script'
WHEN 'CmdExec' THEN 'Operating system (CmdExec)'
WHEN 'PowerShell' THEN 'PowerShell'
WHEN 'Distribution' THEN 'Replication Distributor'
WHEN 'Merge' THEN 'Replication Merge'
WHEN 'QueueReader' THEN 'Replication Queue Reader'
WHEN 'Snapshot' THEN 'Replication Snapshot'
WHEN 'LogReader' THEN 'Replication Transaction-Log Reader'
WHEN 'ANALYSISCOMMAND' THEN 'SQL Server Analysis Services Command'
WHEN 'ANALYSISQUERY' THEN 'SQL Server Analysis Services Query'
WHEN 'SSIS' THEN 'SQL Server Integration Services Package'
WHEN 'TSQL' THEN 'Transact-SQL script (T-SQL)'
ELSE sJSTP.subsystem
END AS [作业子系统类型] ,
[sPROX].[name] AS [作业运行账号] ,
[sJSTP].[database_name] AS [执行数据库名] ,
[sJSTP].[command] AS [执行命令] ,
CASE [sJSTP].[on_success_action]
WHEN 1 THEN 'Quit the job reporting success'
WHEN 2 THEN 'Quit the job reporting failure'
WHEN 3 THEN 'Go to the next step'
WHEN 4
THEN 'Go to Step: '
+ QUOTENAME(CAST([sJSTP].[on_success_step_id] AS VARCHAR(3)))
+ ' ' + [sOSSTP].[step_name]
END AS [执行成功后反应] ,
[sJSTP].[retry_attempts] AS [失败时的重试次数] ,
[sJSTP].[retry_interval] AS [重试间的等待时间 (Minutes)] ,
CASE [sJSTP].[on_fail_action]
WHEN 1 THEN 'Quit the job reporting success'
WHEN 2 THEN 'Quit the job reporting failure'
WHEN 3 THEN 'Go to the next step'
WHEN 4
THEN 'Go to Step: '
+ QUOTENAME(CAST([sJSTP].[on_fail_step_id] AS VARCHAR(3)))
+ ' ' + [sOFSTP].[step_name]
END AS [执行失败后反映]
FROM [msdb].[dbo].[sysjobsteps] AS [sJSTP]
INNER JOIN [msdb].[dbo].[sysjobs] AS [sJOB] ON [sJSTP].[job_id] = [sJOB].[job_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOSSTP] ON [sJSTP].[job_id] = [sOSSTP].[job_id]
AND [sJSTP].[on_success_step_id] = [sOSSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysjobsteps] AS [sOFSTP] ON [sJSTP].[job_id] = [sOFSTP].[job_id]
AND [sJSTP].[on_fail_step_id] = [sOFSTP].[step_id]
LEFT JOIN [msdb].[dbo].[sysproxies] AS [sPROX] ON [sJSTP].[proxy_id] = [sPROX].[proxy_id]
ORDER BY [作业名] ,
[步骤序号]
SQL Server Anget Job Steps ExecutionInformation:
在msdb中同样存储了步骤的执行计划,执行以下语句检查:
SELECT [sJOB].[job_id] AS [作业ID] ,
[sJOB].[name] AS [作业名称] ,
[sJSTP].[step_uid] AS [步骤ID] ,
[sJSTP].[step_id] AS [步骤序号] ,
[sJSTP].[step_name] AS [步骤名称] ,
CASE [sJSTP].[last_run_outcome]
WHEN 0 THEN '失败'
WHEN 1 THEN '成功'
WHEN 2 THEN '重试'
WHEN 3 THEN '取消'
WHEN 5 THEN '未知'
END AS [上次运行状态] ,
STUFF(STUFF(RIGHT('000000'
+ CAST([sJSTP].[last_run_duration] AS VARCHAR(6)), 6),
3, 0, ':'), 6, 0, ':') AS [LastRunDuration (HH:MM:SS)] ,
[sJSTP].[last_run_retries] AS [上次重试次数] ,
CASE [sJSTP].[last_run_date]
WHEN 0 THEN NULL
ELSE CAST(CAST([sJSTP].[last_run_date] AS CHAR(8)) + ' '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([sJSTP].[last_run_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6, 0, ':') AS DATETIME)
END AS [上次运行时间]
FROM [msdb].[dbo].[sysjobsteps] AS [sJSTP]
INNER JOIN [msdb].[dbo].[sysjobs] AS [sJOB] ON [sJSTP].[job_id] = [sJOB].[job_id]
ORDER BY [作业名称] ,
[步骤序号]
SQL Server Agent Job Sechdule Information:
SQLServer允许在特定时间创建各种计划,每个计划能组合成一个或多个SQLServer Agent Jobs。执行以下脚本查询情况:
SELECT [schedule_uid] AS [作业计划ID] ,
[name] AS [作业计划名称] ,
CASE [enabled]
WHEN 1 THEN '已启用'
WHEN 0 THEN '未启用'
END AS [是否启用] ,
CASE WHEN [freq_type] = 64
THEN 'Start automatically when SQL Server Agent starts'
WHEN [freq_type] = 128 THEN 'Start whenever the CPUs become idle'
WHEN [freq_type] IN ( 4, 8, 16, 32 ) THEN 'Recurring'
WHEN [freq_type] = 1 THEN 'One Time'
END [作业计划类型] ,
CASE [freq_type]
WHEN 1 THEN 'One Time'
WHEN 4 THEN 'Daily'
WHEN 8 THEN 'Weekly'
WHEN 16 THEN 'Monthly'
WHEN 32 THEN 'Monthly - Relative to Frequency Interval'
WHEN 64 THEN 'Start automatically when SQL Server Agent starts'
WHEN 128 THEN 'Start whenever the CPUs become idle'
END [作业运行频率] ,
CASE [freq_type]
WHEN 4
THEN 'Occurs every ' + CAST([freq_interval] AS VARCHAR(3))
+ ' day(s)'
WHEN 8
THEN 'Occurs every ' + CAST([freq_recurrence_factor] AS VARCHAR(3))
+ ' week(s) on '
+ CASE WHEN [freq_interval] & 1 = 1 THEN 'Sunday'
ELSE ''
END + CASE WHEN [freq_interval] & 2 = 2 THEN ', Monday'
ELSE ''
END
+ CASE WHEN [freq_interval] & 4 = 4 THEN ', Tuesday'
ELSE ''
END + CASE WHEN [freq_interval] & 8 = 8 THEN ', Wednesday'
ELSE ''
END
+ CASE WHEN [freq_interval] & 16 = 16 THEN ', Thursday'
ELSE ''
END + CASE WHEN [freq_interval] & 32 = 32 THEN ', Friday'
ELSE ''
END
+ CASE WHEN [freq_interval] & 64 = 64 THEN ', Saturday'
ELSE ''
END
WHEN 16
THEN 'Occurs on Day ' + CAST([freq_interval] AS VARCHAR(3))
+ ' of every ' + CAST([freq_recurrence_factor] AS VARCHAR(3))
+ ' month(s)'
WHEN 32
THEN 'Occurs on ' + CASE [freq_relative_interval]
WHEN 1 THEN 'First'
WHEN 2 THEN 'Second'
WHEN 4 THEN 'Third'
WHEN 8 THEN 'Fourth'
WHEN 16 THEN 'Last'
END + ' ' + CASE [freq_interval]
WHEN 1 THEN 'Sunday'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Saturday'
WHEN 8 THEN 'Day'
WHEN 9 THEN 'Weekday'
WHEN 10 THEN 'Weekend day'
END + ' of every '
+ CAST([freq_recurrence_factor] AS VARCHAR(3)) + ' month(s)'
END AS [循环间隔] ,
CASE [freq_subday_type]
WHEN 1
THEN 'Occurs once at ' + STUFF(STUFF(RIGHT('000000'
+ CAST([active_start_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6, 0, ':')
WHEN 2
THEN 'Occurs every ' + CAST([freq_subday_interval] AS VARCHAR(3))
+ ' Second(s) between ' + STUFF(STUFF(RIGHT('000000'
+ CAST([active_start_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6,
0, ':') + ' & '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([active_end_time] AS VARCHAR(6)), 6),
3, 0, ':'), 6, 0, ':')
WHEN 4
THEN 'Occurs every ' + CAST([freq_subday_interval] AS VARCHAR(3))
+ ' Minute(s) between ' + STUFF(STUFF(RIGHT('000000'
+ CAST([active_start_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6,
0, ':') + ' & '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([active_end_time] AS VARCHAR(6)), 6),
3, 0, ':'), 6, 0, ':')
WHEN 8
THEN 'Occurs every ' + CAST([freq_subday_interval] AS VARCHAR(3))
+ ' Hour(s) between ' + STUFF(STUFF(RIGHT('000000'
+ CAST([active_start_time] AS VARCHAR(6)),
6), 3, 0, ':'), 6, 0,
':') + ' & '
+ STUFF(STUFF(RIGHT('000000'
+ CAST([active_end_time] AS VARCHAR(6)), 6),
3, 0, ':'), 6, 0, ':')
END [计划运行频率] ,
STUFF(STUFF(CAST([active_start_date] AS VARCHAR(8)), 5, 0, '-'), 8, 0,
'-') AS [作业启用开始时间] ,
STUFF(STUFF(CAST([active_end_date] AS VARCHAR(8)), 5, 0, '-'), 8, 0,
'-') AS [作业启用结束时间] ,
[date_created] AS [作业创建日期] ,
[date_modified] AS [作业上次修改日期]
FROM [msdb].[dbo].[sysschedules]
ORDER BY [作业计划名称]
SQL Server 作业监控的更多相关文章
- SQL SERVER作业的Schedules浅析
SQL SERVER作业的计划(Schedules),如果你没仔细研究过或没有应用一些复杂的计划(Schedules),那么你觉得SQL SERVER作业的计划(Schedules)非常好用,也没啥问 ...
- 【解决】SQL Server作业中Excel Application不能访问文件
在通过SQL Server作业来实现定时任务时,出现如下错误: FullyQualifiedErrorId : ComMethodTargetInvocation使用“1”个参数调用“Add”时发生异 ...
- 1. SQL Server服务器监控实现方法
对于服务器的监控,和对数据库的监控,很少有合二为一的工具,如果有的话,一般是付费软件,或者自行开发的工具.所以如果不想购买软件,也不想花精力去开发的话,可以结合一些免费/开源的工具.自定义脚本,来完成 ...
- SQL Server Profiler监控执行语句
SQL Server Profiler监控执行语句,这个功能主要用在实时的监控对数据库执行了什么操作,从而及时有效的跟踪系统的运行. 常规配置选项,名称.模板.保存到文件(可以复用). 事件选择,可以 ...
- SQL Server Profiler监控SQL Server性能
全面掌握SQL Server Profiler 1. 原理与相关概念介绍 SQL Server Profiler,大家已经非常熟悉.常常在性能优化中使用,本文档详细介绍SQL Server ...
- 6. SQL Server数据库监控 - 如何告警
原文:6. SQL Server数据库监控 - 如何告警 常用的告警方式大致有:短信.邮件.应用程序 (beep提示,图标提示,升窗提示等),可是不能一直坐在电脑前看着应用程序,或者用脚本部署监控,根 ...
- SQL Server作业没有执行的解决方法
SQL Server作业没有执行的解决方法 确保SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 设置方法: 我的电脑--控制面板--管理工具--服务--右键 SQLSE ...
- SQL SERVER 作业问题(SET 选项的设置不正确: 'QUOTED_IDENTIFIER'。),以及其它定时sql执行方式探索
在实时曲线测试平台中,需要用到实时测试数据作为依据,评估程序的可靠性.在编写sql server作业时,出现了一些问题,经过研究给予解决,供大家参考. 1.编写脚本如下: declare @i int ...
- SQL Server Audit监控触发器状态
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 实现代码(SQL Codes) 注意事项(Attention) 疑问(Questions) 参 ...
随机推荐
- arcgis jsapi 调用google地区服务
做地理信息系统(GIS)项目,除了实现功能用户体验度要好之外,最重要的是地图渲染效果更要好.很多时候苦于数据的完整性和对于配图的审美观,程序猿们都很难配出好看的地图效果.基于上述一般直接调用googl ...
- 基于.net开发chrome核心浏览器【三】
原文:基于.net开发chrome核心浏览器[三] 本篇我们讲解怎么用CefGlue开发一个最简单的浏览器 一: CefGlue是建立在Cef项目之上的,Cef项目是C/C++的项目:CefGlue只 ...
- SessionFactory的创建和Session的获得
1.当我们调用 Configuration config=new Configuration().configure(); 时候Hibernate会自己主动在当前的CLASSPATH中搜寻hibern ...
- STL源代码分析——STL算法remove删除算法
前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...
- VS2010关于error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
前段时间自己的系统一直在安装更新.今天突然打开VS2010当运行的时候一直出现error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏这种错误.然后就百度 解决的方法: 1.项目\属 ...
- hadoop的一些名词解释
在网上收集了一些mapreduce中常用的一些名词的解释,分享一下: Shuffle(洗牌):当第一个map任务完成后,节点可能还要继续执行更多的map 任务,但这时候也开始把map任务的中间输出交换 ...
- 使用JS或jQuery模拟鼠标点击a标签事件代码
原文 使用JS或jQuery模拟鼠标点击a标签事件代码 这篇文章主要介绍了使用JS或jQuery模拟鼠标点击a标签事件代码,需要的朋友可以参考下 <a id="alink" ...
- Java容器的概要
[Java流输入/输出原理] 在Jaav程序.对于输入数据/输出操作"流"(stream)时尚:J2SDK它提供了多种 各种各样的"流"类,用于获得不同类型的数 ...
- pthread_t定义结构
linux下被定义为: 在linux履行pthread_t它被定义为 "unsigned long int",参考这里 Windows下这样定义: /* * Generic han ...
- Easy 2048 Again - ZOJ 3802 像缩进dp
Easy 2048 Again Time Limit: 2 Seconds Memory Limit: 65536 KB Dark_sun knows that on a single-tr ...