You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure SQL Server跨服务器数据库备份恢复YAML Pipeline实现指引

Azure SQL 跨服务器备份恢复的YAML Pipeline实现方案

一、核心可行方向

不管用哪种工具,核心流程都围绕以下三步:

  • 从源Azure SQL数据库导出备份文件(常用BACPAC格式,存储到Azure Blob容器)
  • 将备份文件导入到目标Azure SQL服务器的指定数据库
  • 在Pipeline中处理权限验证、任务状态等待、实验后资源清理等辅助逻辑

二、PowerShell方案实操

这是你正在研究的方向,适合需要自定义复杂逻辑的场景,以下是典型YAML Pipeline片段:

trigger: none # 实验场景建议手动触发

pool:
  vmImage: 'windows-latest'

steps:
- task: AzurePowerShell@5
  inputs:
    azureSubscription: '你的Azure服务连接名称'
    ScriptType: 'InlineScript'
    Inline: |
      # 导出源数据库到Blob存储
      $exportRequest = New-AzSqlDatabaseExport -ResourceGroupName "源资源组" `
        -ServerName "源SQL服务器名" `
        -DatabaseName "源数据库名" `
        -StorageKeyType "StorageAccessKey" `
        -StorageKey (Get-AzStorageAccountKey -ResourceGroupName "存储资源组" -Name "存储账户名").Value[0] `
        -StorageUri "https://存储账户名.blob.core.windows.net/容器名/实验备份.bacpac"

      # 等待导出完成
      while ($exportRequest.Status -eq "InProgress") {
        Start-Sleep -Seconds 30
        $exportRequest = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $exportRequest.OperationStatusLink
      }

      if ($exportRequest.Status -eq "Succeeded") {
        # 导入到目标数据库
        $importRequest = New-AzSqlDatabaseImport -ResourceGroupName "目标资源组" `
          -ServerName "目标SQL服务器名" `
          -DatabaseName "目标数据库名" `
          -StorageKeyType "StorageAccessKey" `
          -StorageKey (Get-AzStorageAccountKey -ResourceGroupName "存储资源组" -Name "存储账户名").Value[0] `
          -StorageUri "https://存储账户名.blob.core.windows.net/容器名/实验备份.bacpac" `
          -Edition "Basic" ` # 根据实验需求选择数据库版本
          -ServiceObjectiveName "Basic" `
          -AdministratorLogin "目标SQL管理员账号" `
          -AdministratorLoginPassword (ConvertTo-SecureString "管理员密码" -AsPlainText -Force)

        # 等待导入完成
        while ($importRequest.Status -eq "InProgress") {
          Start-Sleep -Seconds 30
          $importRequest = Get-AzSqlDatabaseImportExportStatus -OperationStatusLink $importRequest.OperationStatusLink
        }

        if ($importRequest.Status -ne "Succeeded") {
          throw "数据库导入失败: $($importRequest.ErrorMessage)"
        }
      } else {
        throw "数据库导出失败: $($exportRequest.ErrorMessage)"
      }
    azurePowerShellVersion: 'LatestVersion'

注意点:确保Azure服务连接拥有足够权限(源/目标SQL服务器的Contributor权限、存储账户的Storage Blob Data Contributor权限);实验结束后可添加步骤删除Blob中的备份文件,避免不必要的存储成本。

三、更优替代方案

1. Azure DevOps内置任务(推荐,低代码)

Azure DevOps提供了现成的Azure SQL Database Export和Azure SQL Database Import任务,无需手动编写等待逻辑,仅需配置参数即可完成流程:

trigger: none

pool:
  vmImage: 'windows-latest'

steps:
- task: SqlAzureDacpacDeployment@1
  displayName: '导出源数据库到Blob'
  inputs:
    azureSubscription: '你的Azure服务连接名称'
    ServerName: '源SQL服务器名.database.windows.net'
    DatabaseName: '源数据库名'
    SqlUsername: '源SQL管理员账号'
    SqlPassword: '源SQL管理员密码'
    DeploymentAction: 'Export'
    StorageKeyType: 'StorageAccessKey'
    StorageKey: '$(StorageAccountKey)' # 建议用变量组存储敏感信息
    StorageContainerUri: 'https://存储账户名.blob.core.windows.net/容器名/'
    BacpacFileName: '实验备份.bacpac'

- task: SqlAzureDacpacDeployment@1
  displayName: '导入到目标数据库'
  inputs:
    azureSubscription: '你的Azure服务连接名称'
    ServerName: '目标SQL服务器名.database.windows.net'
    DatabaseName: '目标数据库名'
    SqlUsername: '目标SQL管理员账号'
    SqlPassword: '目标SQL管理员密码'
    DeploymentAction: 'Import'
    StorageKeyType: 'StorageAccessKey'
    StorageKey: '$(StorageAccountKey)'
    StorageContainerUri: 'https://存储账户名.blob.core.windows.net/容器名/'
    BacpacFileName: '实验备份.bacpac'
    DatabaseEdition: 'Basic'
    DatabaseServiceObjective: 'Basic'

2. Azure CLI方案(跨平台,简洁)

如果你的Pipeline使用Linux代理,Azure CLI的跨平台支持更友好,命令也更简洁:

trigger: none

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureCLI@2
  displayName: '导出源数据库'
  inputs:
    azureSubscription: '你的Azure服务连接名称'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az sql db export \
        --resource-group "源资源组" \
        --server "源SQL服务器名" \
        --name "源数据库名" \
        --storage-key-type "StorageAccessKey" \
        --storage-key "$(StorageAccountKey)" \
        --storage-uri "https://存储账户名.blob.core.windows.net/容器名/实验备份.bacpac" \
        --admin-user "源SQL管理员账号" \
        --admin-password "$(源SQL管理员密码)"

- task: AzureCLI@2
  displayName: '导入到目标数据库'
  inputs:
    azureSubscription: '你的Azure服务连接名称'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az sql db import \
        --resource-group "目标资源组" \
        --server "目标SQL服务器名" \
        --name "目标数据库名" \
        --storage-key-type "StorageAccessKey" \
        --storage-key "$(StorageAccountKey)" \
        --storage-uri "https://存储账户名.blob.core.windows.net/容器名/实验备份.bacpac" \
        --admin-user "目标SQL管理员账号" \
        --admin-password "$(目标SQL管理员密码)" \
        --edition "Basic" \
        --service-objective "Basic"

四、典型实践案例

  • 实验环境每日刷新:配置定时触发的Pipeline,每天凌晨从生产Azure SQL导出最新备份,覆盖恢复到测试服务器,供开发/测试人员使用。
  • 临时测试环境快速搭建:手动触发Pipeline,按需将指定版本的数据库备份恢复到临时服务器,完成测试后自动清理目标数据库和备份文件。
  • 跨区域数据库迁移实验:模拟跨区域场景,将源区域的Azure SQL数据库导出后,导入到另一区域的目标服务器,验证迁移流程的可行性。

内容的提问来源于stack exchange,提问作者Călimanu Loredan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:21:52