SQL SERVER 作业浅析

作业介绍

SQL SERVER的作业是一系列由SQL SERVER代理按顺序执行的指定操作。作业可以执行一系列活动,包括运行Transact-SQL脚本、命令行应用程序、Microsoft ActiveX脚本、Integration Services 包、Analysis Services 命令和查询或复制任务。作业可以运行重复任务或那些可计划的任务,它们可以通过生成警报来自动通知用户作业状态,从而极大地简化了 SQL Server 管理[参见MSDN]。

创建作业、删除作业、查看作业历史记录....等所有操作都可以通过SSMS管理工具GUI界面操作,有时候也确实挺方便的。但是当一个实例有多个作业或多个数据库实例时,通过图形化的界面去管理、维护作业也是个头痛的问题,对于SQL脚本与GUI界面管理维护作业熟优熟劣这个问题,只能说要看场合。下面主要介绍通过SQL脚本来管理、维护作业。

作业分类

创建作业时,往往需要指定作业类别,如果不指定新建作业类别,就会默认为“[未分类(本地)]”,如下截图所示:

当然,你可以查看、添加、删除、修改作业分类。请看下面操作。

1:查看作业分类

Code Snippet

  1. --method 1:
  2. EXEC msdb.dbo.sp_help_category;
  3. GO
  4. --method 2:
  5. SELECT  category_id            ,--作业类别ID
  6. category_class         ,--类别中项目类型:1=作业2=警报 3=操作员
  7. category_type          ,--类别中类型:=本地、=多服务器、=无
  8. name                    --分类名称
  9. FROMmsdb.dbo.syscategories

有兴趣的可以研究一下存储过程msdb.dbo.sp_help_category

 sp_help_category

2:添加作业分类

如下所示,添加一个叫"DBA_MONITORING"的作业分类

Code Snippet

  1. EXEC msdb.dbo.sp_add_category
  2. @class=N‘JOB‘,
  3. @type=N‘LOCAL‘,
  4. @name=N‘DBA_MONITORING‘ ;
  5. GO
  6. SELECT * FROM msdb.dbo.syscategories WHERE NAME=‘DBA_MONITORING‘
  7. category_id category_class category_type    name
  8. ----------- -------------- ------------- -------------
  9. 102         1              1             DBA_MONITORING

有兴趣的可以研究一下存储过程msdb.dbo.sp_add_category

 sp_add_category

3:删除作业分类

如下所示,删除一个叫"DBA_MONITORING" 的作业分类

Code Snippet

  1. EXEC msdb.dbo.sp_delete_category
  2. @name = N‘DBA_MONITORING‘,
  3. @class = N‘JOB‘ ;
  4. GO

有兴趣的可以研究一下存储过程msdb.dbo.sp_delete_category

 sp_delete_category

4:修改作业类别

msdb.dbo.sp_update_category
     [@class =]class ,
     [@name  =] old_name ,
     [@new_name =] new_name

有兴趣的可以研究一下存储过程msdb.dbo.sp_update_category

 sp_update_category

分析上面四个存储过程可以看出,实质上新增、修改、删除、查看作业类别无非就是对表 msdb.dbo.syscategories进行操作,只是通过存储过程封装了而已,增加了验证等操作,确保数据完整性。

新建作业

创建作业的步骤一般如下所示:

  1. 执行 sp_add_job 来创建作业。
  2. 执行 sp_add_jobstep 来创建一个或多个作业步骤。
  3. 执行 sp_add_schedule 来创建计划。
  4. 执行 sp_attach_schedule 将计划附加到作业。
  5. 执行 sp_add_jobserver 来设置作业的服务器。

本地作业是由本地 SQL Server 代理进行缓存的。因此,任何修改都会隐式强制 SQL Server 代理重新缓存该作业。由于直到调用 sp_add_jobserver 时,SQL Server 代理才缓存作业,因此最后调用 sp_add_jobserver 将更为有效。

下面看用脚本新建一个作业用来每天执行exec sp_cycle_errorlog ,实现错误日志循环, 从下面的脚本量来看,用脚本新建一个作业确实工作量很大,而且容易出错,GUI图形界面创建作业要方便得多,但是如果迁移数据库时,用脚本来新建作业是相当方便的。比GUI图形界面新建一个作业快捷方便多了。

Code Snippet

  1. USE [msdb]
  2. GO
  3. /****** Object:  Job [JOB_CYCLE_ERRORLOG]    Script Date: 08/23/2013 15:25:09 ******/
  4. IFEXISTS(SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N‘JOB_CYCLE_ERRORLOG‘)
  5. EXEC [email protected]_id=N‘a5dff08b-95f8-498e-a6c9-59241fe197b4‘, @delete_unused_schedule=1
  6. GO
  7. USE [msdb]
  8. GO
  9. /****** Object:  Job [JOB_CYCLE_ERRORLOG]    Script Date: 08/23/2013 15:25:09 ******/
  10. BEGIN TRANSACTION
  11. DECLARE @ReturnCode INT
  12. SELECT @ReturnCode = 0
  13. /****** Object:  JobCategory [DBA_MATIANCE]    Script Date: 08/23/2013 15:25:09 ******/
  14. IF NOT EXISTS(SELECT name FROM msdb.dbo.syscategories WHERE name=N‘DBA_MATIANCE‘ AND category_class=1)
  15. BEGIN
  16. EXEC @ReturnCode = [email protected]=N‘JOB‘, @type=N‘LOCAL‘, @name=N‘DBA_MATIANCE‘
  17. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  18. END
  19. DECLARE @jobId BINARY(16)
  20. EXEC @ReturnCode [email protected]_name=N‘JOB_CYCLE_ERRORLOG‘,
  21. @enabled=1,
  22. @notify_level_eventlog=0,
  23. @notify_level_email=0,
  24. @notify_level_netsend=0,
  25. @notify_level_page=0,
  26. @delete_level=0,
  27. @description=N‘每天执行exec sp_cycle_errorlog 实现错误日志循环。‘,
  28. @category_name=N‘DBA_MATIANCE‘,
  29. @owner_login_name=N‘sa‘, @job_id = @jobId OUTPUT
  30. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  31. /****** Object:  Step [Step 1: recycle the errorlog]    Script Date: 08/23/2013 15:25:09 ******/
  32. EXEC @ReturnCode = [email protected][email protected], @step_name=N‘Step 1: recycle the errorlog‘,
  33. @step_id=1,
  34. @cmdexec_success_code=0,
  35. @on_success_action=1,
  36. @on_success_step_id=0,
  37. @on_fail_action=2,
  38. @on_fail_step_id=0,
  39. @retry_attempts=0,
  40. @retry_interval=0,
  41. @os_run_priority=0, @subsystem=N‘TSQL‘,
  42. @command=N‘exec msdb.dbo.sp_cycle_errorlog‘,
  43. @database_name=N‘msdb‘,
  44. @flags=0
  45. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  46. EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
  47. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  48. EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @[email protected], @name=N‘Job Schedule‘,
  49. @enabled=1,
  50. @freq_type=4,
  51. @freq_interval=1,
  52. @freq_subday_type=1,
  53. @freq_subday_interval=0,
  54. @freq_relative_interval=0,
  55. @freq_recurrence_factor=0,
  56. @active_start_date=20130823,
  57. @active_end_date=99991231,
  58. @active_start_time=0,
  59. @active_end_time=235959,
  60. @schedule_uid=N‘2099c694-cd26-4edf-8803-179227bf8770‘
  61. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  62. EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N‘(local)‘
  63. IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
  64. COMMIT TRANSACTION
  65. GOTO EndSave
  66. QuitWithRollback:
  67. IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
  68. EndSave:
  69. GO

作业系统表

与作业有关的系统表、视图大致有下面9个,下面就不费口舌详细解说每一个系统表的作用了,MSDN文档上有详细的解说,有兴趣的翻看一下即可。

SELECT * FROM msdb.dbo.sysjobs            --存储将由 SQL Server 代理执行的各个预定作业的信息

SELECT * FROM msdb.dbo.sysjobschedules    --包含将由 SQL Server 代理执行的作业的计划信息

SELECT * FROM msdb.dbo.sysjobactivity;    --记录当前 SQL Server 代理作业活动和状态

SELECT * FROM msdb.dbo.sysjobservers      --存储特定作业与一个或多个目标服务器的关联或关系

SELECT * FROM msdb.dbo.sysjobsteps;       --包含 SQL Server 代理要执行的作业中的各个步骤的信息

SELECT * FROM msdb.dbo.sysjobstepslogs;   --包含所有 SQL Server 代理作业步骤的作业步骤日志

SELECT * FROM msdb.dbo.sysjobs_view;      --

SELECT * FROM msdb.dbo.sysjobhistory      --包含有关 SQL Server 代理执行预定作业的信息

SELECT * FROM msdb.dbo.syscategories      --包含由 SQL Server Management Studio 用来组织作业、警报和操作员的类别

运行作业

启动作业

1:通过SSMS工具启动作业[参见MSDN]

2:通过SQL命令启动作业

启动作业一般通过sp_start_job来实现,具体语法与操作见下面。

语法:

sp_start_job
     {   [@job_name =] ‘job_name‘
       | [@job_id =] job_id }
     [ , [@error_flag =] error_flag]
     [ , [@server_name =] ‘server_name‘]
     [ , [@step_name =] ‘step_name‘]
     [ , [@output_flag =] output_flag]

例子:

exec msdb.dbo.sp_start_job @job_name=‘JOB_CYCLE_ERRORLOG‘

停止作业

1:通过SSMS工具停作业[参见MSDN]

2:通过SQL命令停止作业

语法:
sp_stop_job
      [@job_name =] ‘job_name‘
    | [@job_id =] job_id
    | [@originating_server =] ‘master_server‘
    | [@server_name =] ‘target_server‘

例子:
exec msdb.dbo.sp_stop_job    @job_name=‘JOB_CYCLE_ERRORLOG‘

启用或禁用作业

1:通过SSMS工具启用作业[参见MSDN]

2:通过SQL命令禁用作业

语法:
sp_update_job [ @job_id =] job_id | [@job_name =] ‘job_name‘
     [, [@new_name =] ‘new_name‘ ]
     [, [@enabled =] enabled ]
     [, [@description =] ‘description‘ ]
     [, [@start_step_id =] step_id ]
     [, [@category_name =] ‘category‘ ]
     [, [@owner_login_name =] ‘login‘ ]
     [, [@notify_level_eventlog =] eventlog_level ]
     [, [@notify_level_email =] email_level ]
     [, [@notify_level_netsend =] netsend_level ]
     [, [@notify_level_page =] page_level ]
     [, [@notify_email_operator_name =] ‘email_name‘ ]
          [, [@notify_netsend_operator_name =] ‘netsend_operator‘ ]
          [, [@notify_page_operator_name =] ‘page_operator‘ ]
     [, [@delete_level =] delete_level ]
     [, [@automatic_post =] automatic_post ]
列子:
EXEC msdb.dbo.sp_update_job
    @job_name = N‘JOB_CYCLE_ERRORLOG‘,
    @enabled = 0 ;  --0 禁用作业、  1启用作业
GO

删除作业

1:通过SSMS工具删除作业[参见MSDN]

2:通过SQL命令删除作业

语法:

sp_delete_job { [ @job_id = ] job_id | [ @job_name = ] ‘job_name‘ } , [ , [ @originating_server = ] ‘server‘ ] [ , [ @delete_history = ] delete_history ] [ , [ @delete_unused_schedule = ] delete_unused_schedule ]

例子:
EXEC msdb.dbo.sp_delete_job  @job_name = ‘JOB_CYCLE_ERRORLOG‘;
    

迁移作业

使用 Transact-SQL 编写作业脚本
  1. 对象资源管理器中,连接到 Microsoft SQL Server 数据库引擎实例,再展开该实例。
  2. 展开“SQL Server 代理”,再展开“作业”,然后右键单击要编写脚本的作业。
  3. 从快捷菜单中,选择“编写作业脚本为”,再选择“CREATE 到”“DROP 到”,并单击下列内容之一:

    新查询编辑器窗口,将打开一个新的查询编辑器窗口,并为其编写 Transact-SQL 脚本。

    文件,将 Transact-SQL 脚本保存到文件。

      剪贴板,将 Transact-SQL 脚本保存到剪贴板

常用管理作业SQL

1:查看属于某个数据库的所有作业。

Code Snippet

  1. SELECT j.job_id        AS JOB_ID            ,
  2. name            AS JOB_NAME          ,
  3. enabled         AS JOB_ENABLED       ,
  4. description     AS JOB_DESCRIPTION   ,
  5. date_created    AS DATE_CREATED      ,
  6. date_modified   AS DATE_MODIFIED
  7. FROM msdb.dbo.sysjobs j
  8. WHERE   job_id IN( SELECTjob_id
  9. FROM    msdb.dbo.sysjobsteps
  10. WHERE   database_name = ‘DataBaseName‘ )

2:查看某个作业类别的所有作业

Code Snippet

  1. SELECT  j.name             AS Job_Name       ,
  2. j.description      AS Job_Description ,
  3. j.date_created     AS Date_Created    ,
  4. j.date_modified    AS Date_Modified   ,
  5. c.name             AS Job_Class
  6. FROM  msdb.dbo.sysjobs j
  7. LEFT JOIN msdb.dbo.syscategories c ON j.category_id = c.category_id
  8. WHEREc.name = ‘[Uncategorized (Local)]‘

3:查看禁用/启用的作业

SELECT * FROM msdb.dbo.sysjobs WHERE  enabled=0    --0:禁用 1:为启用

4:查看出错的作业记录

4.1:查询那些作业在今天出错(如果要查询历史出错作业,去掉查询时间条件即可)

Code Snippet

  1. SELECT name               AS JOB_NAME        ,
  2. description         AS JOB_Description ,
  3. date_created        AS Date_Created    ,
  4. date_modified       AS Date_Modified
  5. FROM  msdb.dbo.sysjobs
  6. WHERE enabled = 1
  7. AND job_id IN(
  8. SELECT  job_id
  9. FROM    Msdb.dbo.sysjobhistory
  10. WHERE   run_status = 0
  11. AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT) )

4.2:查看出错详细信息

Code Snippet

  1. SELECT j.name                AS JOB_NAME ,
  2. h.step_id              AS STEP_ID  ,
  3. h.step_name            AS STEP_NAME,
  4. h.message              AS ERR_MSG  ,
  5. h.run_date             AS RUN_DATE ,
  6. h.run_time             AS RUN_TIME ,
  7. msdb.dbo.agent_datetime(h.run_date, h.run_time) AS ‘RunDateTime‘ ,
  8. CAST(run_duration / 10000 AS VARCHAR(2)) + N‘小时‘
  9. + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))
  10. + N‘分钟‘ + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
  11. LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)
  12. + N‘秒‘ AS run_duration
  13. FROM  msdb.dbo.sysjobhistory h
  14. LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
  15. WHERE run_status = 0
  16. AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)

5:查看作业的执行时间:

5.1:查看当天成功执行的作业的时间(查看的是作业Step信息)

Code Snippet

  1. SELECT j.name         AS job_name ,
  2. h.step_id      AS step_id  ,
  3. h.step_name     AS step_name,
  4. h.message       AS Message  ,
  5. h.run_date      AS Run_date ,
  6. h.run_time      AS run_time ,
  7. msdb.dbo.agent_datetime(h.run_date, h.run_time) AS ‘RunDateTime‘ ,
  8. CAST(run_duration / 10000 AS VARCHAR(2)) + N‘小时‘
  9. + CAST(( run_duration - run_duration / 10000 * 10000 ) / 100 AS VARCHAR(2))
  10. + N‘分钟‘ + SUBSTRING(CAST(run_duration AS VARCHAR(10)),
  11. LEN(CAST(run_duration AS VARCHAR(10))) - 1, 2)
  12. + N‘秒‘ AS run_duration
  13. FROM msdb.dbo.sysjobhistory h
  14. LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
  15. WHERE run_status = 1
  16. AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)
  17. ORDER BY run_duration DESC

5.2:查询每个作业的执行时间、按执行时间降序

Code Snippet

  1. SELECT  j.name            AS JOB_NAME ,
  2. h.run_date        AS RUN_DATE ,
  3. SUM(run_duration) AS SUM_DURATION
  4. FROM  msdb.dbo.sysjobhistory h
  5. LEFT JOIN msdb.dbo.sysjobs j ON h.job_id = j.job_id
  6. WHERE run_status = 1
  7. AND run_date = CAST(CONVERT(VARCHAR(8), GETDATE(), 112) AS INT)
  8. GROUP BY name ,
  9. run_date
  10. ORDER BY Sum_Duration DESC

参考资料:

http://blog.csdn.net/dba_huangzj/article/details/8300178

时间: 2024-08-25 03:19:34

SQL SERVER 作业浅析的相关文章

使用SQL Server作业设置定时任务

1.开启SQL Server Agent服务 使用作业需要SQL Agent服务的支持,并且需要设置为自动启动,否则你的作业不会被执行. 以下步骤开启服务:开始-->>>运行-->>>输入"services.msc"-->>>进入服务,开启SQL Server Agent服务,并设置为自动. 如图: 2.新建作业 点击"SQL Server代理","右击作业",选择"新建作业&quo

SQL SERVER 作业(或叫执行计划)

如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL Server代理->作业(按鼠标右键)->新建作业-> 2.新建作业属性(常规)->名称[自定义本次作业的名称]->启用的方框内是勾号->分类处可选择也可用默认的[未分类(本地)]->所有者默认为登录SQL Server用户[也可选其它的登录]->描述[填写本次工

SQL Server作业的备份

作业备份,不是备份数据库,是备份作业.我的方法是把作业导出成文件备份起来,因为当你服务器维护的多了的时候很多你的作业 就很成问题,很麻烦.最好能够作业实现同步,这个也是第一步,保存成文件,之后个人设想使用powershell 来把作业同步起来 DECLARE @jobname VARCHAR(30),@category_calss_i INT ,@category_calss VARCHAR(50),@category_name VARCHAR(50),@category_type VARCHA

sql server 作业导出放到另外一台机器执行时报错的解决方法

SQL Server2008脚本创建作业失败,提示: 引用内容消息 515,级别 16,状态 2,过程 sp_add_job,第 137 行不能将值 NULL 插入列 'owner_sid',表 'msdb.dbo.sysjobs':列不允许有 Null 值.Insert 失败.语句已终止. 解决方法 在创建作业的脚本中查找@owner_login_name,会找到类似语句: 复制内容到剪贴板 程序代码@owner_login_name=N'WIN-V8UR550191J\Administrat

使用SQL Server Management Studio 创建数据库备份作业

SQL Server 作业无非就是按照规定的时间执行指定的脚本,这里介绍如何用SSMS(SQL Sever 2008)创建作业备份数据库. (0)假设在创建作业之前你所要备份的数据库已经存在:其次,你已经会启动SQL Sever 代理(一般是关闭的) (1)创建SQL Server代理作业 (1.1)新建作业,输出常规信息 如上图:输入作业名称(如:BackupJobTest),这里所有者和类别都是默认的,输入说明(就跟写代码要写注释一样,利人利己) (1.2)设置作业执行步骤 点击左边“选择页

第七篇 SQL Server代理作业活动监视器

本篇文章是SQL Server代理系列的第七篇,详细内容请参考原文 在这系列的前几篇,你创建并配置SQL Server代理作业.每个作业有一个或多个步骤,可能包含大量的工作流.在这篇文章中,将查看作业活动监视器.作业活动监视器是系统管理工具来运行工作,查看作业历史记录,并启用/禁用作业.本文同样会回顾一些作业活动监视器调用的存储过程,你可以直接调用过程做你自己的自定义任务监控.SQL Server代理作业活动监视器SQL Server代理作业活动监视器的主要机制是监视作业运行,以及查看代理已运行

SQL Server 数据库定时自动备份【转】

在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库.要实现数据库的定时自动备份,最常用的方式就是使用SQL Server代理中的作业.启动SQL Server Agent服务,然后在其中新建作业,作业中添加1个备份步骤,类型是T-SQL脚本,然后在命令中输入如下SQL语句,该语句实现了对数据库TestDB1的完整备份,备份文件在C盘Backup文件夹中,文件名就是T

使用SQL Server维护计划实现数据库定时自动备份

在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本没有数据库操作的时候进行,所以我们不可能要求管理员每天守到晚上1点去备份数据库.要实现数据库的定时自动备份,最常用的方式就是使用SQL Server代理中的作业.启动SQL Server Agent服务,然后在其中新建作业,作业中添加1个备份步骤,类型是T-SQL脚本,然后在命令中输入如下SQL语句,该语句实现了对数据库TestDB1的完整备份,备份文件在C盘Backup文件夹中,文件名就是T

SQL Server 数据库定时自动备份(转载)

SQL Server 数据库定时自动备份 本文来源于转载:http://www.cnblogs.com/zhangq723/archive/2012/03/13/2394102.html 前提:在使用下面的备份方式之前需要确保你的Sqlserver Agent服务启动,切设置为自动启动.否则当你服务器重启了但是Agent服务没有启动,那么自动备份任务就不会执行 (一)使用TSql代码自动备份 在SQL Server中出于数据安全的考虑,所以需要定期的备份数据库.而备份数据库一般又是在凌晨时间基本