同一租户内Azure SQL数据库跨订阅低停机迁移方案咨询
跨订阅Azure SQL数据库低停机迁移方案(适配多资源组需求)
可行方案:Azure SQL异地复制跨订阅实现
同一租户下,Azure SQL数据库异地复制完全支持跨订阅,你之前的命令缺少关键的PartnerSubscriptionId参数,导致跨订阅配置失败。以下是完整的实施步骤和修正后的操作:
1. 前置准备
- 订阅B中已创建好目标资源组、SQL服务器及弹性池(按需)
- 操作账号需具备以下RBAC权限:
- 订阅A:SQL Server参与者、SQL数据库参与者
- 订阅B:SQL Server参与者、SQL数据库参与者、对应资源组参与者
- 确认主数据库与目标服务器的服务层级(如GP/BC)、区域兼容
2. 修正后的跨订阅复制PowerShell命令
# 配置参数 $primarySubId = "YOUR-SUB-A-ID" $secondarySubId = "YOUR-SUB-B-ID" $primaryRG = "primary-resource-group" $primaryServer = "primary-sql-server" $secondaryRG = "target-resource-group" $secondaryServer = "target-sql-server" $dbName = "database-to-migrate" $targetPool = "target-elastic-pool" $backupRedundancy = "Local" # 切换到主订阅上下文 Set-AzContext -Subscription $primarySubId # 创建跨订阅副本 New-AzSqlDatabaseSecondary ` -PartnerSubscriptionId $secondarySubId ` -PartnerResourceGroupName $secondaryRG ` -PartnerServerName $secondaryServer ` -PartnerDatabaseName $dbName ` -SecondaryElasticPoolName $targetPool ` -ResourceGroupName $primaryRG ` -ServerName $primaryServer ` -DatabaseName $dbName ` -BackupStorageRedundancy $backupRedundancy ` -AllowConnections "All"
3. 批量迁移脚本(适配600+数据库、多资源组)
针对大量数据库及多目标资源组的场景,可通过循环实现批量配置:
# 筛选要迁移的数据库(排除系统库) $primarySubId = "YOUR-SUB-A-ID" $secondarySubId = "YOUR-SUB-B-ID" $primaryRG = "primary-resource-group" $primaryServer = "primary-sql-server" Set-AzContext -Subscription $primarySubId $targetDbs = Get-AzSqlDatabase -ResourceGroupName $primaryRG -ServerName $primaryServer | Where-Object { $_.DatabaseName -notin @("master", "model", "msdb", "tempdb") } foreach ($db in $targetDbs) { # 根据业务规则分配目标资源组/服务器/弹性池(示例:按DB前缀分组) if ($db.DatabaseName.StartsWith("Group1_")) { $secondaryRG = "target-rg-group1" $secondaryServer = "target-sql-group1" $targetPool = "pool-group1" } elseif ($db.DatabaseName.StartsWith("Group2_")) { $secondaryRG = "target-rg-group2" $secondaryServer = "target-sql-group2" $targetPool = "pool-group2" } # 创建副本 New-AzSqlDatabaseSecondary ` -PartnerSubscriptionId $secondarySubId ` -PartnerResourceGroupName $secondaryRG ` -PartnerServerName $secondaryServer ` -PartnerDatabaseName $db.DatabaseName ` -SecondaryElasticPoolName $targetPool ` -ResourceGroupName $primaryRG ` -ServerName $primaryServer ` -DatabaseName $db.DatabaseName ` -BackupStorageRedundancy "Local" ` -AllowConnections "All" # 等待副本同步完成 do { Set-AzContext -Subscription $secondarySubId $secondaryDb = Get-AzSqlDatabase -ResourceGroupName $secondaryRG -ServerName $secondaryServer -DatabaseName $db.DatabaseName Start-Sleep -Seconds 30 Set-AzContext -Subscription $primarySubId } while ($secondaryDb.ReplicationState -ne "CATCH_UP") # 执行无数据丢失故障转移(停机时间仅几秒) Set-AzContext -Subscription $secondarySubId Failover-AzSqlDatabase ` -ResourceGroupName $secondaryRG ` -ServerName $secondaryServer ` -DatabaseName $db.DatabaseName ` -AllowDataLoss $false }
方案核心优势
- 超低停机:故障转移仅需几秒,迁移期间副本可接受只读请求(通过
AllowConnections参数控制) - 灵活适配:支持将数据库分散到不同资源组/服务器,满足你的多目标部署需求
- 无需导出导入:规避了存储账户操作的繁琐流程,节省时间成本
常见问题排查
- 权限报错:确认操作账号在两个订阅中均拥有
Microsoft.Sql/servers/databases/write等核心权限 - 副本创建失败:检查主库与目标服务器的服务层级、区域是否匹配,目标弹性池容量是否充足
内容的提问来源于stack exchange,提问作者Wesley Neves
相关产品推荐
相关产品推荐

