跨Azure订阅复制Azure SQL数据库是否可行?
跨Azure订阅复制Azure SQL数据库的解决方案
当然能跨Azure订阅复制SQL数据库!你碰到的问题是因为Add-AzureRmAccount每次登录都会覆盖当前的上下文,没法同时保留两个订阅的会话。下面给你两种实用的解决办法:
方法一:使用Azure上下文切换(手动操作首选)
这种方法通过保存不同订阅的上下文,在执行复制命令时明确指定源和目标的上下文,避免覆盖问题:
- 分别登录两个订阅并保存上下文:
# 登录源订阅,保存上下文 Add-AzureRmAccount -SubscriptionId "你的源订阅ID" $sourceContext = Get-AzureRmContext # 登录目标订阅,保存上下文 Add-AzureRmAccount -SubscriptionId "你的目标订阅ID" $targetContext = Get-AzureRmContext
- 执行跨订阅复制命令,明确指定两个上下文:
New-AzureRmSqlDatabaseCopy ` -ResourceGroupName "源数据库所在资源组名" ` -ServerName "源SQL服务器名" ` -DatabaseName "需要复制的数据库名" ` -CopyResourceGroupName "目标资源组名" ` -CopyServerName "目标SQL服务器名" ` -CopyDatabaseName "复制后的新数据库名" ` -AzureRmContext $sourceContext ` -TargetAzureRmContext $targetContext
这里的关键是通过-AzureRmContext和-TargetAzureRmContext参数,分别调用源订阅和目标订阅的上下文,不会互相覆盖。
方法二:使用服务主体(自动化场景首选)
如果要写自动化脚本,用服务主体会更稳定,不需要手动切换登录:
先给服务主体分配源和目标订阅的SQL Contributor(或同等权限)角色,确保它能访问源数据库并在目标服务器创建数据库。
在脚本中分别用服务主体登录两个订阅的上下文:
# 配置源订阅的服务主体登录信息 $sourceServicePrincipal = Get-Credential $sourceContext = Add-AzureRmAccount ` -ServicePrincipal ` -TenantId "你的Azure租户ID" ` -Credential $sourceServicePrincipal ` -SubscriptionId "源订阅ID" # 配置目标订阅的服务主体登录信息 $targetServicePrincipal = Get-Credential $targetContext = Add-AzureRmAccount ` -ServicePrincipal ` -TenantId "你的Azure租户ID" ` -Credential $targetServicePrincipal ` -SubscriptionId "目标订阅ID" # 执行跨订阅复制 New-AzureRmSqlDatabaseCopy ` -ResourceGroupName "源数据库所在资源组名" ` -ServerName "源SQL服务器名" ` -DatabaseName "需要复制的数据库名" ` -CopyResourceGroupName "目标资源组名" ` -CopyServerName "目标SQL服务器名" ` -CopyDatabaseName "复制后的新数据库名" ` -AzureRmContext $sourceContext ` -TargetAzureRmContext $targetContext
注意事项
- 目标SQL服务器必须已经在目标订阅中创建完成,且如果是跨区域复制,需要确保两个区域是Azure支持的复制配对区域。
- 确保使用的账号或服务主体在两个订阅中都拥有足够的权限:源数据库的读取权限,目标服务器的数据库创建权限。
- 数据库大小和跨区域网络延迟会影响复制时间,大数据库可能需要更久,请耐心等待。
内容的提问来源于stack exchange,提问作者Jason Richmeier
相关产品推荐
相关产品推荐

