调度SQL Server作业调度:有效利用时间提升工作效率

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 作业可能需要一些经验,但从长远来看,这将极大地提高工作效率和生产力。

数据库标签