本文介绍 Azure SQL 数据库的弹性作业的功能和详细信息。
- 有关配置弹性作业的教程,请参阅弹性作业教程。
- 详细了解 Azure 数据库平台中的自动化概念。
弹性作业概述
可以创建并计划定期针对一个或多个 Azure SQL 数据库运行的弹性作业。 作业运行 Transact-SQL(T-SQL)查询并执行维护任务。
可以定义运行作业的目标数据库或数据库组。 您还可以 定义作业的运行计划。 弹性作业中的所有日期和时间均为 UTC 时区。
作业处理向目标数据库进行身份验证的任务。 此外,还可以定义、维护和保留 Transact-SQL 脚本,以便跨一组数据库运行。
每个作业都会记录执行状态,并在发生任何失败时自动重试作。
何时使用弹性作业
在以下方案中使用弹性作业自动化:
-
将管理任务自动化,并计划它们在每个工作日或例如下班后运行。
- 部署架构更改和管理凭据。
- 收集性能数据或租户(客户)日志。
- 更新引用数据(所有数据库的公用信息)。
- 从 Azure Blob 存储服务加载数据。
-
将作业配置为定期跨数据库集合运行,例如在非高峰时段运行。
- 持续将一组数据库中的查询结果收集到中央表中。
- 查询可以持续运行并配置为触发其他任务。
-
收集要报告的数据
- 将数据库集合中的数据聚合到单个目标表中。
- 跨一组大型数据库运行数据处理查询,例如收集客户日志。 结果将收集到单个目标表以供进一步分析。
-
数据移动
- 适用于自定义开发的解决方案、业务自动化或其他任务管理。
- 用于提取、转换和加载数据库中表之间的数据的 ETL 处理。
在以下情况下,可以考虑使用弹性作业:
有一个任务需要按计划定期运行,以一个或多个数据库为目标。
具有需要运行一次但跨多个数据库的任务。
需要针对数据库的任意组合运行作业:可以是一个或多个单独的数据库,可以是一个服务器上的所有数据库,可以是一个弹性池中的所有数据库,而且还可以灵活地包括或排除任何特定的数据库。 任务可以跨多个服务器、多个池运行,甚至可以在不同订阅中的数据库上运行。 服务器和池会在运行时进行动态枚举,因此作业会针对执行时目标组中存在的所有数据库来运行。
- 此功能与 SQL 代理有很大区别,它无法动态枚举目标数据库,尤其是在动态添加或删除数据库的 SaaS 客户方案中。
弹性作业组件
| 组件 | 说明 |
|---|---|
| 弹性作业代理 | 您为运行和管理作业而创建的 Azure 资源。 |
| 作业数据库 | 作业代理用于存储作业相关数据、作业定义等的 Azure SQL 数据库中的数据库。 |
| 作业 | 作业是由一个或多个作业步骤组成的工作单元。 作业步骤指定要运行的 T-SQL 脚本和其他所需详细信息。 |
| 目标组 | 一组服务器、池和数据库,可对其运行作业。 |
弹性作业代理
弹性作业代理是用于创建、运行和管理作业的 Azure 资源。 可以在门户中将弹性作业代理创建为 Azure 资源(还支持< c0>使用 PowerShell 和 REST API 创建和管理弹性作业)。
创建弹性作业代理需要现有的 Azure SQL 数据库中的数据库。 代理将这个现有的 Azure SQL 数据库配置为作业数据库。
可以通过 Azure 门户启动、禁用或取消作业。 通过 Azure 门户还可查看作业定义和执行历史记录。
弹性作业代理的成本
在 Azure SQL 数据库中,作业数据库的费率与其他数据库相同。 弹性作业代理的成本基于您为作业代理选择的服务层的固定价格。 有关详细信息,请参阅 Azure SQL 数据库定价页。
弹性作业数据库
使用 作业数据库 定义作业并跟踪作业执行的状态和历史记录。 作业在目标数据库中运行。 作业数据库还存储代理元数据、日志、结果和作业定义。 它包含许多有用的存储过程和其他数据库对象,用于使用 T-SQL 创建、运行和管理作业。
需要 Azure SQL 数据库才能创建弹性作业代理。 作业代理将其所有与作业相关的元数据存储在 作业数据库中,该数据库应为新的空 Azure SQL 数据库。
作业数据库的建议服务目标是 DTU S1 或更高版本,但最佳选择取决于作业的性能需求:作业步骤数、作业目标数以及作业运行频率。
如果针对作业数据库的操作的速度比预期慢,则在出现速度缓慢的情况时使用 Azure 门户或 sys.dm_db_resource_stats DMV 监视作业数据库中的数据库性能和资源利用率。 如果资源(如 CPU、数据 IO 或日志写入)的使用率达到 100%,且与出现缓慢情况的时间段相关,请考虑以增量方式将数据库扩展到更高的服务目标(采用 基于 DTU 的购买模型或 vCore 购买模型),直到工作数据库性能得到充分改进。
作业数据库本身可以是弹性作业的目标。 在此情境中,将作业数据库视为任何其他目标数据库。 必须创建作业用户并在作业数据库中授予足够的权限。 作业用户的数据库范围凭据必须存在于作业数据库中,就像在任何其他目标数据库中一样。
当作业数据库是作业的目标时,请确保作业不会修改或删除存储在该数据库中的任何特定于作业代理的元数据。 仅使用 作业存储过程 或 作业视图 修改或查询作业相关信息。
重要
请勿修改现有对象或在 作业数据库中创建新对象,但可以从表中读取报表和分析对象。
弹性作业和作业步骤
作业是按计划或作为一次性作业运行的工作单元。 作业包含一个或多个作业步骤。
每个作业步骤指定要运行的 T-SQL 脚本、一个或多个要对其运行 T-SQL 脚本的目标组,以及作业代理连接到目标数据库所需的凭据。 每个作业步骤都有可自定义的超时和重试策略,并且可以选择性地指定输出参数。
弹性作业目标
弹性作业 可以跨大量数据库、按计划或按需并行运行一个或多个 T-SQL 脚本。 目标可以是 Azure SQL 数据库的任何层。
可以针对数据库的任何组合运行计划作业:一个或多个单独的数据库、服务器上的所有数据库或弹性池中的所有数据库,并增加了包括或排除任何特定数据库的灵活性。 作业可以跨多个服务器和多个池运行,甚至可以针对不同订阅中的数据库运行。 服务器和池会在运行时进行动态枚举,因此作业会针对执行时目标组中存在的所有数据库来运行。
下图显示了一个跨不同类型的目标组执行作业的作业代理:
目标组
目标组定义运行作业步骤的数据库集。 目标组可以包含以下类型的任意数字和组合:
逻辑 SQL Server:如果指定服务器,则在执行作业时服务器中存在的所有数据库都是组的一部分。 必须提供
master数据库凭据,以便可以在作业执行之前枚举和更新组。 有关逻辑服务器的详细信息,请参阅 什么是 Azure SQL 数据库和 Azure Synapse 中的逻辑服务器?弹性池:如果指定弹性池,则执行作业时弹性池中的所有数据库都是组的一部分。 与服务器一样,您必须提供
master数据库凭据,以便在作业执行之前更新组。单一数据库:指定要成为组一部分的一个或多个单个数据库。
提示
在作业执行时, 动态枚举 会重新评估目标组中包括服务器或池的数据库集。 动态枚举确保在执行作业时,作业可以跨服务器或池中存在的所有数据库运行。 在运行时重新评估数据库列表对于池或服务器成员身份频繁更改的情况非常有用。
池和单一数据库可以包含或排除在组中。 可以使用任意数据库组合创建目标组。 例如,可以向目标组添加一个服务器,但将弹性池中的特定数据库排除出去(也可以排除整个池)。
目标组可以包含多个订阅中的数据库,并可以跨多个区域。 跨区域执行的延迟高于同一区域内的执行。
以下示例演示如何在作业执行时动态枚举不同的目标组定义,以确定要影响的数据库:
示例 1 演示的目标组包含一个由各个数据库组成的列表。 当作业步骤使用此目标组时,作业步骤的操作将在每个数据库中执行。
示例 2 演示的目标组包含一个充当目标的服务器。 当作业步骤使用此目标组时,将动态列举服务器中的数据库以识别当前在服务器中的数据库列表。 作业步骤的动作在每个数据库中执行。
示例 3 演示的目标组与示例 2 的类似,但明确排除了单个数据库。 作业步骤的操作不会在排除的数据库中执行。
示例 4 演示的目标组包含一个充当目标的弹性池。 与 示例 2 类似,池在作业运行时动态枚举,以确定池中的数据库列表。
- 示例 5 和示例 6 演示高级方案,其中的服务器、弹性池和数据库可以使用包括和排除规则进行组合。
弹性作业计划
弹性作业是云优先产品。 即使在安排时出现了暂时性的网络或服务可用性问题,它们仍然能按设计启动。 弹性作业计划考虑到计划开始时间和请求的间隔。 创建弹性作业计划时,作业会在每个计划间隔事件后尽快运行。
重要
最佳做法是创建从将来开始的作业计划。
作业计划检测到错过的事件。 如果创建新的作业计划,该计划从过去开始,该作业将在启用时立即执行。 如果禁用或不可用,则作业会在启用或可用后立即运行。
例如,它当前为 1 月 2 日上午 9 点 UTC。 你设置了一个新作业,计划在今晚,即 1 月 2 日晚上 10:30(UTC)开始,并每天运行。 作业在下午 10:30(UTC)执行。
为防止作业意外启动,请创建在未来开始的计划。 在一个可能导致意外启动任务的示例中,你设置了一个新任务,使其每天在 UTC 时间晚上 10:30 运行。 你将该作业禁用了一周。 然后,如果在 UTC 时间上午 8:30 启用作业,作业将立即执行,以补偿昨晚应执行但错过的间隔事件。 执行后,作业代理要到晚上10点30分(UTC)才会根据下一个计划再次运行。 若要防止在 UTC 的上午 8:30 执行,请将作业计划的开始时间更新为 1 月 8 日晚上 10:30,然后启用作业。 或者,在作业可以立即运行的时间启用作业。
身份验证
为弹性作业代理的所有目标选择一种方法。 例如,在单个弹性作业代理中,你无法将一个目标服务器配置为使用数据库范围凭据,而另一个服务器则配置为使用 Microsoft Entra ID 身份验证。
弹性作业代理可以使用两个身份验证选项连接到目标组指定的服务器和数据库:
通过用户分配的托管标识 (UMI) 进行身份验证
建议使用通过用户分配的托管标识 (UMI) 的 Microsoft Entra 身份验证来将弹性作业连接到 Azure SQL 数据库。 通过 Microsoft Entra ID 的支持,作业代理使用 UMI 连接到目标数据库(包括数据库、服务器和弹性池)以及输出数据库。
(可选)可以在包含弹性作业数据库的逻辑服务器上启用Microsoft Entra ID 身份验证,以便通过 Microsoft Entra ID 连接访问和查询该数据库。 但是,作业代理使用基于证书的内部身份验证连接到其作业数据库。
可以创建一个 UMI,或使用现有的 UMI,并将相同的 UMI 分配给多个作业代理。 每个作业代理仅支持一个 UMI。 将 UMI 分配到作业代理后,作业代理使用此标识在目标数据库中连接和运行 T-SQL 作业。 作业代理不会对目标服务器或数据库使用 SQL 身份验证。
UMI 名称必须以字母或数字开头,长度介于 3 到 128 个字符之间。 它可以包含连字符 (-) 和下划线 (_) 字符。
有关 Azure SQL 数据库中 UMI 的详细信息,请参阅 Azure SQL 的托管标识,包括使用 UMI 作为 Azure SQL 数据库逻辑服务器标识所需的步骤和优势。 有关更多信息,请参阅 SQL Server 的 Microsoft Entra 身份验证。
重要
使用 Microsoft Entra ID 身份验证时,请在每个目标数据库中从该 Microsoft Entra ID 创建 jobuser 用户。 向用户授予在每个目标数据库中执行作业所需的权限。
不支持使用系统分配的托管标识(SMI)。
通过数据库范围的凭据进行身份验证
虽然 Microsoft Entra(以前为 Azure Active Directory)身份验证是推荐的选项,但你可以将任务配置为,在执行时使用 数据库范围的凭据 连接到目标组指定的数据库。 在 2023 年 10 月之前,数据库范围的凭据是唯一的身份验证选项。
如果目标组包含服务器或池,这些数据库作用域凭据将连接到 master 数据库以枚举可用数据库。
在 作业数据库中创建凭据,其范围限于数据库。
所有目标数据库必须有一个具有足够权限的登录名,否则作业无法成功完成(下图中的
jobuser)。在目标数据库中创建的凭据(
LOGIN和PASSWORD用于masteruser和jobuser,如下面的图中所示)应与在作业数据库中创建的IDENTITY和SECRET凭据匹配。可以在作业之间重复使用凭据。 凭据密码经过加密和保护,防止具有只读访问权限的用户获取作业对象。
下图可帮助你了解如何设置正确的作业凭据,以及弹性作业代理如何使用数据库凭据作为身份验证连接到目标服务器和数据库中的登录名和用户。
注意
使用数据库作用域的凭据时,请记住在每个目标数据库中创建 jobuser 用户。
弹性作业专用终结点
弹性作业代理支持弹性作业专用终结点。 通过创建弹性作业专用终结点,可建立弹性作业与目标服务器之间的专用链接。 弹性作业专用终结点的功能与 Azure 专用链接不同。
弹性作业专用终结点功能支持与目标和输出服务器的专用连接,因此即使启用了 “拒绝公共访问 ”选项,作业代理也能访问它们。 如果要禁用 “允许 Azure 服务和资源访问该服务器 ”选项,则使用专用终结点也是一种可能的解决方案。
弹性作业专用终结点支持弹性作业代理身份验证的所有选项。
弹性作业专用终结点功能允许选择服务托管的专用终结点,以在作业代理与其目标和输出服务器之间建立安全连接。 服务托管的专用终结点是特定虚拟网络和子网中的专用 IP 地址。 选择在某个作业代理的目标和输出服务器上使用专用终结点时,Azure 会创建服务托管的专用终结点。 然后,此专用终结点由作业代理专门用于连接和执行作业,或用于在该目标和输出数据库上写入作业输出。
可以通过 Azure 门户创建和允许弹性作业专用终结点。 通过专用链接连接的目标服务器可以位于 Azure 中的任何位置,即使在不同的地理位置和订阅中也是如此。 必须为每个所需的目标服务器和作业输出服务器创建专用终结点,才能启用此通信。
有关为弹性作业配置新的服务托管专用终结点的教程,请参阅配置 Azure SQL 弹性作业专用终结点。
弹性作业专用终结点的要求
若要使用弹性作业专用终结点,作业代理和目标服务器或数据库都必须托管在 Azure 中(相同或不同的区域)。
必须为作业代理的主机订阅以及目标和输出服务器的主机订阅注册
Microsoft.Network资源提供程序。Azure 为每个目标和输出服务器创建弹性作业专用终结点。 必须先批准它们,然后弹性作业代理才能使用它们。 可以通过该逻辑服务器或首选客户端的网络窗格批准它们。 然后,弹性作业代理可以使用专用连接访问该服务器下的任何数据库。
从弹性作业代理到作业数据库的连接不使用专用终结点。 作业代理本身使用基于证书的内部身份验证来连接到其作业数据库。
- 如果将任务数据库添加为目标组成员,它会像普通目标一样运行。 您需要根据需要设置专用终结点。
弹性作业数据库权限
在创建作业代理期间,会在作业数据库中创建一个架构、多个表和一个名为 jobs_reader 的角色。 此角色使用以下权限创建,旨在为管理员提供进行作业监视所需的更细致访问控制。 管理员通过将用户添加到jobs_reader 角色中,赋予他们在作业数据库中监控作业执行的能力。
| 角色名称 |
jobs 架构权限 |
jobs_internal 架构权限 |
|---|---|---|
jobs_reader |
SELECT |
无 |
注意
不要更新 作业数据库中的内部目录视图,例如 jobs.target_group_members。 手动更改上述目录视图可能会损坏“作业数据库”并导致失败。 上述视图仅用于只读查询。 可以使用 作业数据库中 的存储过程添加或删除目标组和成员,例如 jobs.sp_add_target_group_member。
在授予对“职位数据库”的提升访问权限之前,请考虑安全隐患。 有权创建或编辑作业的恶意用户可以创建或编辑使用存储凭据连接到恶意用户控制下的数据库的作业。 此漏洞可能允许恶意用户确定凭据的密码或执行恶意命令。
监视弹性作业
弹性作业代理与用于作业状态通知的 Azure 警报集成,简化了用于监视作业执行状态和历史记录的解决方案。
Azure 门户包含用于支持弹性作业和作业监视的额外功能。 在弹性作业代理的 “概述 ”页上,将显示最新的作业执行,如以下屏幕截图所示。
可以使用 Azure 门户、Azure CLI、PowerShell 和 REST API 创建 Azure Monitor 警报规则。 失败的弹性作业指标是监视和接收有关弹性作业执行情况的警报的良好入手点。 此外,还可以选择通过 Azure 警报设施的可配置操作(如短信或电子邮件)发出警报。 有关详细信息,请参阅在 Azure 门户中为 Azure SQL 数据库创建警报。
示例见创建、配置和管理弹性作业。
作业输出
详细记录每个目标数据库上作业步骤的结果,脚本输出可以捕获到指定的表。 可以指定一个数据库,用于保存从作业返回的任何数据。
作业历史记录
可以通过查询表来查看作业数据库中的jobs.job_executions。 系统清理作业清除超过 45 天的执行历史记录。 若要手动删除不足45天的历史记录,请在sp_purge_jobhistory中执行存储过程。
作业状态
可以通过查询表 ,在作业数据库中jobs.job_executions。
最佳实践
使用弹性数据库作业时,请考虑以下最佳实践。
安全最佳做法
将 API 的使用限制为受信任的个人。
向凭证授予执行作业步骤所需的最低必要权限。 有关详细信息,请参阅授权和权限。
在使用服务器或池目标组成员时,请为
master数据库创建一个单独的凭据,以便具有查看和列出数据库的权限。 此凭据在作业执行之前扩展服务器和池的数据库列表。
弹性作业性能
弹性作业在等待长时间运行的作业完成时使用极少的计算资源。
根据目标数据库组的大小和作业所需执行时间(并发辅助角色数)的不同,代理需要的计算量和作业数据库性能也会有所不同(目标数和作业数越多,所需计算量越大)。
并发容量层
从 2023 年 10 月开始,弹性作业代理具有多层性能,从而可以增加容量。
容量增量表示作业代理可以连接到和启动作业的并发目标数据库的总数。 若要获取更多用于作业执行的并发目标连接,请从默认 JA100 层升级作业代理的层,该层限制为 100 个并发目标连接。
在任何时候,大多数环境需要执行少于 100 个并发作业,因此默认设置为 JA100。
| 弹性作业代理层 | 最大并发作业数 |
|---|---|
JA100 |
100 |
JA200 |
200 |
JA400 |
400 |
JA800 |
800 |
超过作业代理的并发容量等级会导致某些目标数据库和服务器出现队列延迟。 例如,如果在 JA100 层中启动具有 110 个目标的作业,则 10 个目标将等待开始,直到其他人完成。
可以通过 Azure 门户、 PowerShell 或 作业代理 REST API 修改弹性作业代理的层或服务目标。 有关示例,请参阅缩放作业代理。
限制对弹性池的作业影响
若要确保在针对 Azure SQL 数据库弹性池中的数据库运行作业时资源不会过度负担,请将作业配置为限制作业同时运行的数据库数。
通过在 T-SQL 中设置 sp_add_jobstep 存储过程的 @max_parallelism 参数来设置作业运行时所在的并发数据库的数目。
幂等脚本
弹性作业的 T-SQL 脚本必须是 幂等的,也就是说,如果脚本成功并再次运行,则会发生相同的结果。 脚本可能由于暂时性网络问题而失败。 在这种情况下,作业会在停止运行之前自动重试运行脚本的预设次数。 幂等脚本具有相同的结果,即使成功运行两次(或更多)。
一个简单的策略是在创建对象之前测试其是否存在。 以下示例是假设的:
IF NOT EXISTS (SELECT *
FROM sys.objects
WHERE [name] = N'some_object')
PRINT 'Object does not exist'; -- Create the object
ELSE
PRINT 'Object exists'; -- If it exists, drop the object before recreating it.
同样地,脚本必须以逻辑方式测试并反驳它所找到的任何条件,才能成功执行。
限制
弹性作业服务目前存在以下限制。 产品团队正积极努力消除尽可能多的这些限制。
| 问题 | 说明 |
|---|---|
| 故障转移或迁移到新的 Azure 区域后,需要重新创建并启动弹性作业代理。 | 弹性作业服务将其所有作业代理和作业元数据存储在作业数据库中。 将 Azure 资源的任何故障转移或移动到新的 Azure 区域也会将作业数据库、作业代理和作业元数据移到新的 Azure 区域。 但是,弹性作业代理是一种仅用于计算的资源,需要在新区域中明确重新创建并启动,然后作业才能再次执行。 启动后,弹性作业代理会根据之前定义的作业计划恢复在新区域中执行作业。 |
| 作业数据库中的 SQL 审核日志数量过多 | 弹性作业代理通过不断轮询作业数据库来检查新作业的到达情况以及其他增删改查 (CRUD) 操作。 如果在包含作业数据库的服务器上启用了审核,则作业数据库可以生成大量审核日志。 可以通过使用带谓词表达式的 Set-AzSqlServerAudit 命令筛选掉这些审核日志,以缓解此问题。例如: Set-AzSqlServerAudit -ResourceGroupName "ResourceGroup01" -ServerName "Server01" -BlobStorageTargetState Enabled -StorageAccountResourceId "/subscriptions/7fe3301d-31d3-4668-af5e-211a890ba6e3/resourceGroups/resourcegroup01/providers/Microsoft.Storage/storageAccounts/mystorage" -PredicateExpression "application_name <> 'Microsoft Azure SQL Database elastic jobs'"此命令仅过滤出作业代理到作业数据库的审核日志,不对作业代理到任何目标数据库的审核日志进行过滤。 |
| 使用超大规模数据库作为作业数据库 | 不支持使用超大规模数据库作为作业数据库。 但是,弹性作业可将超大规模数据库用作目标,就如同将 Azure SQL 数据库中的任何其他数据库用作目标一样。 |
| 无服务器数据库与弹性作业的自动暂停功能。 | 不支持将已启用自动暂停功能的无服务器数据库用作作业数据库。 面向弹性作业的无服务器数据库确实支持自动暂停,而作业的连接会使其恢复运行。 |
| 将作业数据库导出到 BACPAC 文件 | 不支持将 作业数据库 导出到 BACPAC 文件。 如果需要导出包含 作业数据库的 SQL Server,请先删除 作业数据库 ,然后再导出服务器。 |