1. 什么是SQL Server作业调度?
SQL Server作业调度是一种自动化任务的方法,其中任务将在SQL Server中以预定间隔运行。这些任务可以是基于一定程度的自定义或根据特定的时间表来执行。 SQL Server作业调度可以签入数据库维护,日志清除和备份等任务。
SQL Server 作业可包含多个作业步骤,每个步骤可能包含不同的Transact-SQL 代码或其他特定任务。 SQL Server 代理会根据提供的时间表来完成每个作业步骤任务的处理。若干个作业步骤可以出现在一个作业中,这些步骤可能是在同一台或不同的计算机上进行处理。
2. 如何创建SQL Server作业?
2.1 创建SQL Server代理
在创建作业之前,需要首先创建一个 SQL Server 代理,该代理是控制数据库引擎中自动执行任务的组件。
下面是SQL Server代理的创建代码:
USE [msdb]
GO
EXEC msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'My Jobs'
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_add_proxy @proxy_name=N'My Proxy', @credential_name=N'My Credentials', @enabled=1
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_grant_proxy_to_subsystem @proxy_name=N'My Proxy', @subsystem_id=1
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_verify_proxy_identifiers
GO
2.2 创建SQL Server作业
下面是创建 SQL Server 作业的示例代码:
USE [msdb]
GO
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'My Jobs' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'My Jobs'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'My Job',
@enabled=1,
@notify_level_eventlog=0,
@notify_level_email=0,
@notify_level_netsend=0,
@notify_level_page=0,
@delete_level=0,
@description=N'This is a test job.',
@category_name=N'My Jobs',
@owner_login_name=N'sa',
@job_id = @jobId OUTPUT
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'My Job Step',
@step_id=1,
@cmdexec_success_code=0,
@on_success_action=1,
@on_fail_action=2,
@retry_attempts=0,
@retry_interval=0,
@os_run_priority=0, @subsystem=N'TSQL',
@command=N'SELECT * FROM sys.objects',
@database_name=N'master',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(LOCAL)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
这将在 SQL Server 代理中创建名为“ My Job”的作业和一个名为“ My Job Step”的步骤。步骤是可执行的Transact-SQL 语句。 在此示例中,这个Transact-SQL语句只是选择名称以“ sys.objects”开头的所有内容。
3. 如何调度SQL Server作业?
有多种方法可用于调度 SQL Server 作业。 最简单的方法是使用 SQL Server 代理,从 SQL Server管理器或SQL Server 代理中查找“作业”。 在此处,用户可以创建新作业或编辑现有作业,并设置作业的执行计划或调度程序。 此外,还可以在所需的时间执行作业。
下面是设置SQL Server作业调度程序的SQL代码示例:
USE [msdb]
GO
EXEC msdb.dbo.sp_add_schedule @schedule_name=N'My Schedule 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=20180726,
@active_end_date=99991231,
@active_start_time=0,
@active_end_time=235959,
@schedule_uid=N'e083df59-5e2f-4b4e-a4c3-6dcfd638a140'
GO
USE [msdb]
GO
EXEC msdb.dbo.sp_attach_schedule @job_name=N'My Job', @schedule_name=N'My Schedule 1'
GO
此代码会在“执行计划”选项卡上创建新的计划程序
此代码将计划程序连接到名为 My Job(在上一个示例中创建)的作业。
4. 如何监视SQL Server作业?
最后,SQL Server 作业监视是很重要的,因为用户需要了解作业是否已成功完成,还是已失败或暂停并需要进一步修复。 SQL Server代理提供了多种监视选项,可以帮助用户监视 SQL Server 作业并确定哪些作业需要进一步调整或修改。
下面是SQL Server 作业监视示例代码:
USE [msdb]
GO
SELECT
[j].[name] AS [Job Name],
[s].[name] AS [Step Name],
[jst].[message] AS [Last Message],
CASE [j].[enabled]
WHEN 1 THEN 'Yes'
ELSE 'No'
END AS [Is Enabled],
CASE [j].[currently_running]
WHEN 1 THEN 'Yes'
ELSE 'No'
END AS [Is Running],
[j].[run_requested_date] AS [Scheduled Run Date],
[j].[run_requested_source] AS [Requested Source]
FROM
[dbo].[sysjobs] AS [j]
LEFT OUTER JOIN
[dbo].[sysjobsteps] AS [s]
ON
[j].[job_id] = [s].[job_id]
OUTER APPLY
(
SELECT TOP 1
[js].[message]
FROM
[dbo].[sysjobhistory] AS [js]
WHERE
[js].[job_id] = [j].[job_id]
AND
[js].[step_id] = [s].[step_id]
ORDER BY
[js].[run_date] DESC,
[js].[run_time] DESC
)
AS [jst]
ORDER BY
[j].[name],
[s].[step_id];
这个例子将返回 SQL Server 代理中的所有作业及其步骤。此外,还将显示每个作业的当前运行状态以及最后一条消息的内容,以便用户可以快速了解作业的情况。
5. 结论
SQL Server作业调度是将数据库工作自动化的快速而簡單的方法。 它可用于自动运行多个任务,包括常规的维护、备份和日志清除。 随着数据库的增长和数据量的增加,SQL Server作业调度变得越来越重要。 编写和调度 SQL Server 作业可能需要一些经验,但从长远来看,这将极大地提高工作效率和生产力。