您的位置:首页 > 数据库

SQL Server -- 作业(Job) 浅析2

2016-09-06 10:14 429 查看
4:修改作业类别
msdb.dbo.sp_update_category [@class =] 'class' , [@name =] 'old_name' , [@new_name =] 'new_name'
有兴趣的可以研究一下存储过程msdb.dbo.sp_update_categorySET QUOTED_IDENTIFIER OFFSET ANSI_NULLS ONGOCREATEPROCEDUREsp_update_category@class VARCHAR(8),@name sysname,@new_name sysnameASBEGINDECLARE@retval INTDECLARE@category_id INTDECLARE@category_classINTSET NOCOUNT ONSELECT@class =LTRIM(RTRIM(@class))SELECT@name =LTRIM(RTRIM(@name))SELECT@new_name=LTRIM(RTRIM(@new_name))IF@name='' SELECT@name=NULLEXECUTE@retval= sp_verify_category @class,NULL,@new_name,@category_class OUTPUT,NULLIF (@retval<>0)RETURN(1)IF@nameISNOTNULLANDNOTEXISTS(SELECT*FROMmsdb.dbo.syscategories WHERE name=@nameAND category_class =@category_class)BEGINRAISERROR(14526, -1, -1, @name, @category_class)RETURN(1)ENDSELECT@category_id=category_idFROM msdb.dbo.syscategoriesWHERE (category_class =@category_class)AND (name =@new_name)IF (@category_idISNOTNULL)BEGINRAISERROR(14261, -1, -1, '@new_name', @new_name)RETURN(1)ENDIF (@category_id<100)BEGINRAISERROR(14276, -1, -1, @name, @class)RETURN(1)ENDUPDATE msdb.dbo.syscategoriesSET name =@new_nameWHERE (category_class =@category_class)AND (name =@name)RETURN(@@error)ENDGOsp_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 SnippetUSE [msdb]GO /****** Object: Job[JOB_CYCLE_ERRORLOG] Script Date:08/23/2013 15:25:09 ******/ IFEXISTS(SELECT job_idFROM msdb.dbo.sysjobs_view WHERE name = N'JOB_CYCLE_ERRORLOG')EXEC msdb.dbo.sp_delete_job@job_id=N'a5dff08b-95f8-498e-a6c9-59241fe197b4',@delete_unused_schedule=1GO USE [msdb] GO /****** Object: Job [JOB_CYCLE_ERRORLOG] Script Date: 08/23/2013 15:25:09 ******/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 /****** Object: JobCategory [DBA_MATIANCE] Script Date: 08/23/2013 15:25:09 ******/ IF NOT EXISTS(SELECTname FROM msdb.dbo.syscategories WHERE name=N'DBA_MATIANCE' ANDcategory_class=1) BEGIN EXEC @ReturnCode =msdb.dbo.sp_add_category@class=N'JOB', @type=N'LOCAL', @name=N'DBA_MATIANCE' IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback END DECLARE @jobIdBINARY(16) EXEC @ReturnCode=msdb.dbo.sp_add_job@job_name=N'JOB_CYCLE_ERRORLOG', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'????execsp_cycle_errorlog ?????????', @category_name=N'DBA_MATIANCE', @owner_login_name=N'sa', @job_id =@jobId OUTPUT IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback /****** Object: Step [Step 1: recycle the errorlog] Script Date: 08/23/2013 15:25:09 ******/ EXEC @ReturnCode =msdb.dbo.sp_add_jobstep@job_id=@jobId, @step_name=N'Step 1: recycle theerrorlog', @step_id=1, @cmdexec_success_code=0, @on_success_action=1, @on_success_step_id=0, @on_fail_action=2, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'execmsdb.dbo.sp_cycle_errorlog', @database_name=N'msdb', @flags=0 IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode =msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode =msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'Job Schedule', @enabled=1, @freq_type=4, @freq_interval=1, @freq_subday_type=1, @freq_subday_interval=0, @freq_relative_interval=0, @freq_recurrence_factor=0, @active_start_date=20130823, @active_end_date=99991231, @active_start_time=0, @active_end_time=235959, @schedule_uid=N'2099c694-cd26-4edf-8803-179227bf8770' IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback EXEC @ReturnCode =msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' IF (@@ERROR <> 0OR @ReturnCode <> 0) GOTO QuitWithRollback COMMIT TRANSACTION GOTO EndSave QuitWithRollback: IF (@@TRANCOUNT > 0) ROLLBACKTRANSACTION EndSave: GO作业系统表 与作业有关的系统表、视图大致有下面9个,下面就不费口舌详细解说每一个系统表的作用了,MSDN文档上有详细的解说,有兴趣的翻看一下即可。 SELECT * FROMmsdb.dbo.sysjobs --存储将由 SQL Server 代理执行的各个预定作业的信息SELECT * FROM msdb.dbo.sysjobschedules --包含将由 SQL Server 代理执行的作业的计划信息SELECT * FROM msdb.dbo.sysjobactivity; --记录当前 SQL Server 代理作业活动和状态SELECT * FROM msdb.dbo.sysjobservers --存储特定作业与一个或多个目标服务器的关联或关系SELECT * FROMmsdb.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] 例子: execmsdb.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' 例子:execmsdb.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 ]
列子:

EXECmsdb.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 ] 例子:EXECmsdb.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 SnippetSELECT j.job_id ASJOB_ID , name ASJOB_NAME , enabled ASJOB_ENABLED , description ASJOB_DESCRIPTION , date_created ASDATE_CREATED , date_modified ASDATE_MODIFIEDFROM msdb.dbo.sysjobsjWHERE job_idIN(SELECTjob_id FROM msdb.dbo.sysjobsteps WHERE database_name='DataBaseName') 2:查看某个作业类别的所有作业 Code SnippetSELECTj.name ASJob_Name , j.description ASJob_Description, j.date_created ASDate_Created , j.date_modified ASDate_Modified , c.name ASJob_ClassFROM msdb.dbo.sysjobsj LEFTJOINmsdb.dbo.syscategoriescONj.category_id=c.category_id WHEREc.name='[Uncategorized (Local)]' 3:查看禁用/启用的作业SELECT * FROM msdb.dbo.sysjobs WHERE enabled=0 --0:禁用 1:为启用 4:查看出错的作业记录 4.1:查询那些作业在今天出错(如果要查询历史出错作业,去掉查询时间条件即可)Code SnippetSELECT name ASJOB_NAME , description ASJOB_Description, date_created ASDate_Created , date_modified ASDate_ModifiedFROM msdb.dbo.sysjobsWHERE enabled= 1 ANDjob_idIN( SELECT job_id FROM Msdb.dbo.sysjobhistory WHERE run_status= 0 ANDrun_date=CAST(CONVERT(VARCHAR(8),GETDATE(), 112)ASINT)) 4.2:查看出错详细信息Code SnippetSELECT j.name ASJOB_NAME, h.step_id ASSTEP_ID , h.step_name ASSTEP_NAME, h.message ASERR_MSG , h.run_date ASRUN_DATE, h.run_time ASRUN_TIME, msdb.dbo.agent_datetime(h.run_date,h.run_time)AS'RunDateTime', CAST(run_duration/ 10000 ASVARCHAR(2))+N'小时' +CAST((run_duration-run_duration/ 10000 * 10000 )/ 100 ASVARCHAR(2)) +N'分钟'+SUBSTRING(CAST(run_durationASVARCHAR(10)), LEN(CAST(run_durationASVARCHAR(10)))- 1, 2) +N'秒'ASrun_durationFROM msdb.dbo.sysjobhistoryh LEFTJOINmsdb.dbo.sysjobsjONh.job_id=j.job_idWHERE run_status= 0 ANDrun_date=CAST(CONVERT(VARCHAR(8),GETDATE(), 112)ASINT) 5:查看作业的执行时间:5.1:查看当天成功执行的作业的时间(查看的是作业Step信息)Code SnippetSELECT j.name ASjob_name, h.step_id ASstep_id , h.step_name ASstep_name, h.message ASMessage , h.run_date ASRun_date, h.run_time ASrun_time, msdb.dbo.agent_datetime(h.run_date,h.run_time)AS'RunDateTime', CAST(run_duration/ 10000 ASVARCHAR(2))+N'小时' +CAST((run_duration-run_duration/ 10000 * 10000 )/ 100 ASVARCHAR(2)) +N'分钟'+SUBSTRING(CAST(run_durationASVARCHAR(10)), LEN(CAST(run_durationASVARCHAR(10)))- 1, 2) +N'秒'ASrun_durationFROM msdb.dbo.sysjobhistoryh LEFTJOINmsdb.dbo.sysjobsjONh.job_id=j.job_id WHERE run_status= 1 ANDrun_date=CAST(CONVERT(VARCHAR(8),GETDATE(), 112)ASINT) ORDERBYrun_durationDESC 5.2:查询每个作业的执行时间、按执行时间降序Code SnippetSELECT j.name AS JOB_NAME , h.run_date ASRUN_DATE , SUM(run_duration)ASSUM_DURATIONFROM msdb.dbo.sysjobhistoryh LEFTJOINmsdb.dbo.sysjobsjONh.job_id=j.job_idWHERE run_status= 1 ANDrun_date=CAST(CONVERT(VARCHAR(8),GETDATE(), 112)ASINT)GROUPBYname, run_dateORDERBYSum_DurationDESC参考资料:http://blog.csdn.net/dba_huangzj/article/details/8300178
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  SQL JOB