SQL Server 作业监控

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文: SQL Server 作业监控 在讲解SQLServer Agent Jobs之前,先要讲解msdb。 Msdb是SQLServer的系统数据库之一,用于存储SQLServer的配置、元数据等信息。
原文: 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语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
15天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
25天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
15天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
2天前
|
SQL 数据管理 关系型数据库
如何在 Windows 上安装 SQL Server,保姆级教程来了!
在Windows上安装SQL Server的详细步骤包括:从官方下载安装程序(如Developer版),选择自定义安装,指定安装位置(非C盘),接受许可条款,选中Microsoft更新,忽略警告,取消“适用于SQL Server的Azure”选项,仅勾选必要功能(不包括Analysis Services)并更改实例目录至非C盘,选择默认实例和Windows身份验证模式,添加当前用户,最后点击安装并等待完成。安装成功后关闭窗口。后续文章将介绍SSMS的安装。
6 0
|
10天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
23 0
|
14天前
|
SQL 监控 数据库
数据库管理与电脑监控软件:SQL代码优化与实践
本文探讨了如何优化数据库管理和使用电脑监控软件以提升效率。通过SQL代码优化,如使用索引和调整查询语句,能有效提高数据库性能。同时,合理设计数据库结构,如数据表划分和规范化,也能增强管理效率。此外,利用Python脚本自动化收集系统性能数据,并实时提交至网站,可实现对电脑监控的实时性和有效性。这些方法能提升信息系统稳定性和可靠性,满足用户需求。
48 0
|
15天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
19天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
21 1
|
19天前
|
SQL 安全 Java
SQL server 2017安装教程
SQL server 2017安装教程
17 1