自动执行数据库任务,以实现可伸缩性

已完成

从 SQL Server 使用自动化时,通常使用 SQL 代理计划作业以实现自动化目的。 虽然在 Azure 虚拟机上运行的 Azure SQL 托管实例和 SQL Server 仍具有该选项,但 Azure SQL 数据库没有,因此可能需要使用其他自动化方法来实现类似的结果。

Azure 自动化

可以通过 Azure 自动化实现流程自动化、配置管理以及与 Azure 平台选项(如基于角色的访问控制和 Microsoft Entra ID)的完全集成。Azure 自动化还可管理 Azure 和本地资源。

借助 Azure 自动化,可以轻松控制 Azure 和本地 VM 中的资源。 例如,可以使用混合 runbook 自动执行任务(如启动 VM、运行 SQL Server 备份和关闭 VM),实现高性价比和高效。

另一个常见的方案是将 Azure 自动化用于定期维护操作,例如清除过时的或旧数据,或重新编制 SQL 数据库索引。

组件

Azure 自动化支持自动化和配置管理活动。 我们将重点介绍自动化组件,但你也可以使用 Azure 自动化来管理服务器更新和配置。

组件 说明
Runbook Runbook 是 Azure 自动化中的执行单元。 Runbook 定义为以下三种类型之一:基于 PowerShell 的图形 runbook、PowerShell 脚本或 Python 脚本。 PowerShell Runbook 通常用于管理 Azure SQL 资源。
模块 Azure 自动化为在 runbook 中执行的 PowerShell 或 Python 代码定义了执行上下文。 若要执行代码,你需要导入支持模块。 例如,如果要运行 Get-AzSqlDatabase PowerShell cmdlet,则需要将 Az.SQL PowerShell 模块导入自动化帐户。
凭据 凭据存储 runbook 或配置在运行时间使用的敏感信息。
计划 计划链接到 runbook,并在特定时间触发 runbook。

若要详细了解可用于管理 Azure SQL 数据库和 Azure SQL 托管实例资源的 Azure CLI 和 PowerShell 命令,请参阅以下链接:用于 Azure SQL 的 PowerShell 模块用于 Azure SQL 的 Azure CLI

弹性作业

许多 DBA 熟悉 Azure 自动化的一个原因在于,Azure SQL 数据库最初缺少计划作业的功能。

此限制意味着 DBA 必须找到替代解决方案才能高效地处理这些基本任务。 Azure 自动化在此场景中成为一种有价值的工具,提供了创建和管理计划作业、自动执行数据库迁移过程和执行日常维护任务的手段。

体系结构

借助弹性作业功能,能够以一次性作业的形式对服务器或数据库集运行 T-SQL 脚本集,或者使用已定义的计划。 弹性作业的工作方式与 SQL Server 代理作业的工作方式类似,不同之处在于它们只限于执行 T-SQL。 作业适用于 Azure SQL 数据库的所有层。

Screenshot of the elastic job architecture diagram.

若要配置弹性作业,需要具备专门用于管理作业的作业代理和数据库。 作业数据库的推荐服务层为 S1 或更高级别。最佳服务层取决于执行的作业数量和这些作业的频率。

让我们回顾一下弹性作业的组成部分:

  • 弹性作业代理 - 用于运行和管理作业的 Azure 资源。
  • 作业数据库 - 专门用于管理作业的数据库。
  • 目标组 - 将在其中运行作业的服务器、弹性池和单一数据库的集合。
  • 作业 - 组成作业步骤的一个或多个 T-SQL 脚本。

如果服务器或弹性池是目标,则应在服务器或池的主服务器数据库中创建凭据,以便作业代理可以枚举其中的数据库。 对于单个数据库,只需要数据库凭据。 凭据应该具有执行作业步骤所需的最低权限。

Screenshot of the elastic job agent creation page.

可以通过Azure 门户创建弹性作业代理。 在“弹性作业代理”页上,确保为代理提供名称,并为作业数据库指定 SQL 数据库。

以下 PowerShell 脚本创建名为 MyFirstElasticJob 的弹性作业,向该作业添加作业步骤,并执行 SQL 命令来创建表(如果数据库中不存在表)。

Write-Output "Creating a new job..."
$jobName = "MyFirstElasticJob"
$job = $jobAgent | New-AzSqlElasticJob -Name $jobName -RunOnce

Write-Output "Creating job steps for $($jobName) job..."
$sqlText1 = "IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = object_id('MyTable')) CREATE TABLE [dbo].[MyTable]([Id] [int] NOT NULL);"

$job | Add-AzSqlElasticJobStep -Name "Step1" -TargetGroupName $serverGroup.TargetGroupName -CredentialName $jobCred.CredentialName -CommandText $sqlText1

最后,运行 MyFirstElasticJob 弹性作业。

Write-Output "Start the job..."
$jobExecution = $job | Start-AzSqlElasticJob
$jobExecution

用例场景

弹性作业可用于以下场景:

  • 自动化管理任务以按特定计划运行。
  • 部署架构更改。
  • 数据移动。
  • 为报告或其他目的收集和聚合数据。
  • 从 Azure Blob 存储加载数据。
  • 配置作业,以便定期(例如,在非高峰时段)对一系列数据库执行作业。
  • 对大量数据库(例如遥测收集)进行数据处理。 然后,结果将编译到单个目标表以供进一步分析。

将 SQL 代理作业迁移到弹性作业

虽然可以创建自己的脚本来将 SQL 代理作业迁移到弹性作业,但可以采用一种更方便的方式。 存在一个可下载的脚本,该脚本有助于将现有 SQL 代理作业复制到弹性作业

该脚本是一种自动执行转换这些作业的过程的工具,可节省在新环境中手动重新创建作业的时间和精力。

该文件是一个压缩文件夹,其中包含脚本和相关文档。 若要使用它,需要下载文件,并按照说明进行操作。

输入说明中列出的所有参数后,作业列表将显示。 然后,脚本将单独创建处于禁用状态的每个作业,假设作业尚不存在。 创建作业后,将使用相同的 ID、命令文本、重试尝试次数和初始重试间隔秒数添加步骤。 链接到作业步骤的数据库将是目标组。 如果目标组不存在,系统会自动创建它。 副本不包括计划、警报和通知。

将 SQL 代理作业迁移到 Azure 上的 SQL 代理

将作业从本地 SQL Server 迁移到虚拟机上运行的 Azure SQL 托管实例或 SQL Server 遵循大多数 DBA 应该熟悉的过程。

在我们的场景中,假设我们已将本地 SQL Server 迁移到 Azure SQL 托管实例。 我们需要迁移和调整若干 SQL 代理作业,使它们在 Azure 环境中无缝运行。

  • 评估依赖项:确定要迁移的 SQL 代理作业。 列出作业所依赖的任何依赖项,例如链接服务器、凭据和数据库

  • 编写 SQL 代理作业脚本:将 SQL Server 上的 SQL 代理作业编写为 SQL 脚本。 为此,可以右键单击 SQL Server Management Studio (SSMS) 中的作业,然后选择“将作业编写为”->“创建到”->“新建查询编辑器窗口”。

  • 修改作业依赖项:查看 SQL 脚本并修改可能因迁移而更改的任何作业依赖项。 例如,如果作业引用本地服务器上的链接服务器或文件路径,请更新它以匹配新环境。

  • Azure SQL MI 作业创建:打开 SSMS 或 Azure Data Studio 并连接到 Azure SQL 托管实例。 使用之前生成的脚本创建新的 SQL 代理作业。

  • 在 Azure SQL MI 上创建依赖项:如果 SQL 代理作业依赖于链接服务器或凭据,请在 Azure SQL MI 环境中创建它们。 确保它们与本地 SQL Server 的配置匹配。

  • 计划作业:使用 SQL Server 代理在 Azure SQL MI 中设置作业计划。 可以创建新的计划并将其链接到作业。

  • 测试:在 Azure SQL MI 环境中全面测试 SQL 代理作业,以确保其按预期运行。 检查是否有由于本地 SQL Server 和 Azure SQL MI 之间的差异而可能出现的任何错误或问题。

  • 监视和维护:监视作业的性能,并确保它继续满足 Azure SQL MI 环境中的要求。 根据需要调整任何配置或计划。