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
相关产品推荐
相关产品推荐

