本文概述了 SQL Server 代理,它是在 SQL Server 和 Azure SQL 托管实例中执行计划管理任务(称为作业)的 Microsoft Windows 服务。
重要
Azure SQL 托管实例,目前大多数但并非所有 SQL Server 代理功能都受支持。 有关详细信息,请参阅 Azure SQL 托管实例 T-SQL 与 SQL Server 的差异 或 SQL 托管实例中的 SQL 代理作业限制 。
SQL Server 代理的好处
SQL Server 代理使用 SQL Server 存储作业信息。 作业包含一个或多个作业步骤。 每个步骤都有自己的任务。例如,备份数据库。
SQL Server 代理可以按照计划运行作业,也可以在响应特定事件时运行作业,还可以根据需要运行作业。 例如,如果希望在每个工作日下班后备份公司的所有服务器,就可以使该任务自动执行。 安排备份在星期一到星期五 22:00 之后运行。 如果备份遇到问题,SQL Server 代理可记录该事件并通知你。
注释
默认情况下,SQL Server 安装后 SQL Server 代理服务处于禁用状态,除非用户明确选择自动启动该服务。
SQL Server 代理组件
SQL Server 代理使用下列组件来定义要执行的任务、执行任务的时间以及报告任务成功或失败的方式。
使用 SQL Server 配置管理器管理 SQL Server 代理服务,并使用 SQL Server Management Studio (SSMS) 在图形用户界面中轻松管理 SQL Server 代理属性、作业、警报、操作员和代理。
职位
作业是 SQL Server 代理执行的一系列指定操作。 使用作业能够定义可一次或多次运行的,并且可以监视其成功或失败状态的管理任务。 一个作业可在一台本地服务器或者多台远程服务器上运行。
重要
在 SQL Server 故障转移群集实例上发生故障转移事件时运行的 SQL Server 代理作业在故障转移到另一个故障转移群集节点后不会恢复。 如果暂停导致故障转移到另一个节点,则当 Hyper-V 节点暂停时运行的 SQL Server 代理作业不会恢复。 由于故障转移事件而开始但无法完成的作业记录为已启动,但不会显示完成或失败的其他日志条目。 这些方案中的 SQL Server 代理作业似乎永远不会结束。
可以通过下列几种方式来运行作业:
- 根据一个或多个计划。
- 响应一个或多个警报。
- 通过执行
sp_start_job存储过程。
作业中的每个操作都是一个“作业步骤” 。 例如,作业步骤可能包括运行 Transact-SQL 语句、执行 SQL Server Integration Services (SSIS) 包或向 Analysis Services 服务器发出命令。 作业步骤作为作业的一部分进行管理。
所有作业步骤均在特定的安全上下文中运行。 对于使用 Transact-SQL 的作业步骤,请使用 EXECUTE AS 该语句设置作业步骤的安全上下文。 对于其他类型的作业步骤,请使用代理帐户来设置作业步骤的安全上下文。
使用 sp_help_job 系统存储过程来查找有关特定作业的信息。 使用 dbo.sysjobs 系统表查看有关作业的信息。 例如,使用以下 Transact-SQL (T-SQL) 语句查看有关服务器上的所有作业的信息:
USE msdb;
GO
SELECT job_id,
[name]
FROM dbo.sysjobs;
附表
“计划” 指定了作业运行的时间。 多个作业可按同一计划运行,可将多个计划应用到同一作业。 计划可为作业运行时间定义以下条件:
- 每当 SQL Server 代理启动时。
- 每当计算机的 CPU 使用率处于你定义为空闲的级别时。
- 一次,在特定日期和时间。
- 按重复的计划运行。
有关详细信息,请参阅 “创建计划”并将计划附加到作业。
警报
“警报” 是对特定事件的自动响应。 例如,事件可以是启动的作业,也可以是达到特定阈值的系统资源。 可以定义警报产生的条件。
警报可以响应下列任一条件:
- SQL Server 事件
- SQL Server 性能条件
- 运行 SQL Server 代理的计算机上的 Microsoft Windows Management Instrumentation (WMI) 事件
警报可以执行下列操作:
- 通知一个或多个操作员
- 运行作业
有关详细信息,请参阅警报。
运营商
“操作员” 定义的是负责维护一个或多个 SQL Server 实例的个人的联系信息。 在有些企业中,操作员职责被分配给一个人。 在拥有多个服务器的企业中,操作员职责可以由多人分担。 操作员不涉及安全信息,因此不会定义安全主体。
SQL Server 可以通过以下方法通知操作员警报:
- 电子邮件
- 寻呼程序(通过电子邮件)
- net send命令
注释
SQL Server 代理所在的计算机必须启动 Windows Messenger 服务,才能使用net send 发送通知。
重要
在 SQL Server 的未来版本中,将从 SQL Server 代理中删除 Pager 和 net send 选项。 避免在新开发工作中使用这些功能,并计划修改当前使用这些功能的应用程序。
若要使用电子邮件或寻呼程序向操作员发送通知,必须将 SQL Server 代理配置为使用数据库邮件。 有关详细信息,请参阅数据库邮件。
可以将操作员定义为一组个人的别名。 这样,该别名的所有成员就可以同时进行验证。 有关详细信息,请参阅 运算符。
SQL Server 代理管理的安全性
SQL Server 代理在数据库中使用以下固定数据库角色之一来控制对非 msdb 固定服务器角色成员的用户对 SQL Server 代理的访问。
- SQLAgentUserRole
- SQLAgentReaderRole
- SQLAgentOperatorRole
除了这些固定数据库角色之外,子系统和代理还有助于数据库管理员确保每个作业步骤运行时都具有执行其任务所需的最低权限。
角色
中的 SQLAgentUserRole、SQLAgentReaderRole 和 msdb 固定数据库角色的成员以及 sysadmin 固定服务器角色的成员具有访问 SQL Server 代理的权限。 不属于这些角色的用户不能使用 SQL Server 代理。 有关 SQL Server 代理使用的角色的详细信息,请参阅 “实现 SQL Server 代理安全性”。
子系统
子系统是预定义的对象,表示作业步骤可用的功能。 每个代理都可以访问一个或多个子系统。 子系统可以提供安全性,因为它们分隔了对可用于代理的功能的访问。 除 Transact-SQL 作业步骤外,每个作业步骤都在代理的上下文中运行。 Transact-SQL 作业步骤使用 EXECUTE AS 命令将安全上下文设置为作业的所有者。
SQL Server 定义了下表中列出的子系统:
| 子系统名称 | DESCRIPTION |
|---|---|
| Microsoft ActiveX 脚本 | 运行 ActiveX 脚本作业步骤。 警告 在未来版本的 Microsoft SQL Server 中,将从 SQL Server 代理中删除 ActiveX 脚本编写子系统。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 |
| 操作系统 (CmdExec) | 运行可执行程序。 |
| PowerShell | 运行 PowerShell 脚本作业步骤。 |
| 复制分发服务器 | 运行作业步骤以激活复制分发代理。 |
| 复制合并 | 运行激活复制合并代理的作业步骤。 |
| 复制队列读取器 | 运行一个作业步骤,该步骤激活复制队列读取器代理。 |
| 复制快照 | 运行激活复制快照代理的作业步骤。 |
| 复制事务日志读取器 | 运行激活复制日志读取器代理的作业步骤。 |
| Analysis Services 命令 | 运行 Analysis Services 命令。 |
| Analysis Services 查询 | 运行 Analysis Services 查询。 |
| SSIS 包执行 | 运行 SSIS 包。 |
注释
由于 Transact-SQL 作业步骤不使用代理,因此没有用于 Transact-SQL 作业步骤的 SQL Server 代理子系统。
SQL Server 代理会强制实施子系统限制,即使代理的安全主体正常拥有在作业步骤中运行任务的权限也是如此。 例如,作为 sysadmin 固定服务器角色成员的用户的代理无法运行 SSIS 作业步骤,除非代理有权访问 SSIS 子系统,即使用户可以运行 SSIS 包。
代理
SQL Server 代理使用代理帐户管理安全上下文。 一个代理可用于多个作业步骤。 sysadmin 固定服务器角色的成员可创建代理。
每个代理对应于安全凭据。 每个代理都可与一组子系统和一组登录名相关联。 代理仅可用于使用与该代理相关联的子系统的作业步骤。 若要创建使用特定代理的作业步骤,作业所有者必须使用与该代理关联的登录名,或者具有对代理的无限制访问权限的角色的成员。 sysadmin 固定服务器角色的成员可以无限制地访问代理。
SQLAgentUserRole、SQLAgentReaderRole 或 SQLAgentOperatorRole 的成员只能使用向其授予特定访问权限的代理。 这些 SQL Server 代理固定数据库角色的每个成员用户必须获得访问特定代理的权限,才能创建使用那些代理的作业步骤。
自动化管理
使用以下步骤来配置 SQL Server 代理以自动管理 SQL Server:
确定哪些管理任务或服务器事件定期执行以及这些任务或事件是否可以通过编程方式进行管理。 如果任务涉及一系列可预见的步骤并且在特定时间或响应特定事件时执行,则该任务非常适合自动化。
使用 SQL Server Management Studio、Transact-SQL 脚本或 SQL Server 管理对象 (SMO) 定义一组作业、计划、警报和操作员。 有关详细信息,请参阅 创建职位。
运行定义的 SQL Server 代理作业。
注释
对于默认的 SQL Server 实例,SQL Server 服务命名为 SQLSERVERAGENT。 对于命名实例,SQL Server 代理服务将被命名为 SQLAgent$instancename。
如果您正在运行 SQL Server 的多个实例,则可以使用多服务器管理来自动管理所有实例的公共任务。 有关详细信息,请参阅 企业范围的自动化管理。
通过以下任务开始使用 SQL Server 代理:
| DESCRIPTION | 文章 |
|---|---|
| 介绍如何配置 SQL Server 代理。 | 配置 SQL Server 代理 |
| 介绍如何启动、停止和暂停 SQL Server 代理服务。 | 启动、停止或暂停 SQL Server 代理服务 |
| 介绍为 SQL Server 代理服务指定帐户时的注意事项。 | 为 SQL Server 代理服务选择帐户 |
| 介绍如何使用 SQL Server 代理错误日志。 | SQL Server 代理程序错误日志 |
| 介绍如何使用性能对象。 | 使用性能对象 |
| 介绍维护计划向导,它是一个实用工具,可用来创建作业、警报和运算符来对 SQL Server 实例进行自动管理。 | 使用维护计划向导 |
| 介绍如何使用 SQL Server 代理将管理任务自动化。 | 自动执行管理任务(SQL Server 代理) |
NOSQLPS
从 SQL Server 2019 开始,可以禁用 SQLPS。 可以在 PowerShell 类型的作业步骤的第一行添加 #NOSQLPS,这将阻止 SQL 代理自动加载 SQLPS 模块。 现在,SQL 代理作业将运行安装在计算机上的 PowerShell 版本,然后你可以使用自己喜欢的任何其他 PowerShell 模块。
要在 SQL 代理作业步骤中使用 SqlServer 模块,可以将此代码放在脚本的前两行。
#NOSQLPS
Import-Module -Name SqlServer
TDS 8.0 和严格的加密支持
SQL Server 2025 (17.x) 预览版引入了对 SQL Server 代理的 TDS 8.0 和 TLS 1.3 支持,可以使用严格的加密。 SQL Server 代理发现 SQL Server 配置管理器 (Force Strict Encryption或 Force Encryption无)中配置的加密级别,并使用相应的选项连接到 SQL Server(strict或 mandatory) optional。 连接到本地实例的 SQL 代理 T-SQL 作业使用 SQL Server 代理加密设置。 这意味着,如果 SQL Server 代理使用 strict 加密进行连接,则本地 T-SQL 作业也会使用相同的加密级别进行连接。
| 已启用 TLS 版本 | SQL 配置管理器 配置设置 |
预期的 SQL Server 代理执行结果 | 描述 |
|---|---|---|---|
| TLS 1.3 | 强制严格加密 | 成功连接并启动 | TDS 8.0 使用 strict 加密 |
| TLS 1.3 | 强行加密 | 无法连接和启动 | TLS 1.3 需要 strict |
| TLS 1.3 | None | 无法连接和启动 | TLS 1.3 需要 strict 加密 |
| TLS 1.2 | 强制严格加密 | 成功连接并启动 | TDS 8.0 可以使用 TLS 1.2 |
| TLS 1.2 | 强行加密 | 成功连接并启动 | TDS 7.x 用于 mandatory 连接 |
| TLS 1.2 | None | 成功连接并启动 | TDS 7.x 用于 optional 连接 |
| TLS 1.3 和 TLS 1.2 | 强制严格加密 | 成功连接并启动 | TDS 8.0 使用 strict 加密 |
| TLS 1.3 和 TLS 1.2 | 强行加密 | 成功连接并启动 | 用于 mandatory 连接的 TDS 7.x |
| TLS 1.3 和 TLS 1.2 | None | 成功连接并启动 | TDS 7.x 用于 optional 连接 |