跨Azure订阅将Azure SQL Server数据库复制到Azure SQL托管实例的方法
跨订阅将Azure SQL Server数据库复制到Azure SQL托管实例的操作步骤
方案一:Bacpac导出导入(一次性迁移)
这是最通用的离线迁移方法,适合不需要实时同步的场景。
步骤1:导出订阅B的SQL数据库到Azure存储账户
- 登录Azure门户,找到订阅B中的目标SQL数据库,进入「导出」页面
- 选择同区域的Azure存储账户(跨区域也可,速度较慢)和存储容器,设置导出的Bacpac文件名,确认启动导出任务
- 也可使用PowerShell命令批量操作:
New-AzSqlDatabaseExport ` -ResourceGroupName "你的订阅B资源组名" ` -ServerName "订阅B的SQL Server名" ` -DatabaseName "要迁移的数据库名" ` -StorageKeyType "StorageAccessKey" ` -StorageKey "存储账户的访问密钥" ` -StorageUri "https://你的存储账户名.blob.core.windows.net/容器名/目标文件名.bacpac"
步骤2:配置订阅A托管实例对存储账户的访问权限
如果Bacpac文件存在于订阅B的存储账户:
- 给订阅A托管实例所在的VNet配置存储服务端点,或者将托管实例的公共IP添加到存储账户的防火墙白名单中
- 也可直接将Bacpac文件复制到订阅A的存储账户,简化权限配置:
az storage blob copy start \ --source-uri "https://订阅B存储账户名.blob.core.windows.net/容器名/源文件.bacpac" \ --destination-blob "目标文件名.bacpac" \ --destination-container "订阅A存储容器名" \ --account-name "订阅A存储账户名"
步骤3:将Bacpac导入到订阅A的SQL托管实例
- 登录Azure门户,找到订阅A的SQL托管实例,进入「导入数据库」页面
- 选择存储账户中的Bacpac文件,设置目标数据库名称,输入托管实例的管理员账号密码,启动导入任务
- 对应PowerShell命令:
New-AzSqlInstanceDatabaseImport ` -ResourceGroupName "你的订阅A资源组名" ` -InstanceName "订阅A的托管实例名" ` -Name "导入后的数据库名" ` -StorageKeyType "StorageAccessKey" ` -StorageKey "存储账户的访问密钥" ` -StorageUri "https://你的存储账户名.blob.core.windows.net/容器名/源文件名.bacpac" ` -AdministratorLogin "托管实例管理员账号" ` -AdministratorLoginPassword (ConvertTo-SecureString "管理员密码" -AsPlainText -Force)
方案二:事务复制(支持实时同步)
如果需要持续保持源数据库和托管实例的同步,可使用事务复制方案,前提是源SQL Server版本为2016及以上(或Azure SQL数据库)。
步骤1:在订阅B的SQL Server上配置发布服务器
- 启用SQL Server的复制代理服务(如果是Azure SQL数据库则无需手动操作)
- 创建事务发布,选择要同步的数据库及对象,设置发布的访问权限
步骤2:打通跨订阅网络连通性
- 配置订阅A托管实例的VNet与订阅B SQL Server的VNet对等连接,或通过VPN/ExpressRoute实现网络互通
- 确保双方防火墙规则允许彼此的IP或VNet访问
步骤3:在订阅A的托管实例上创建订阅
- 连接到托管实例,创建推送订阅,指向订阅B的发布服务器
- 初始化订阅,完成初始数据同步后,即可保持实时的事务同步
关键注意事项
- 兼容性检查:提前确认源数据库的功能(如CLR、分区等)在Azure SQL托管实例中是否支持
- 数据库大小:Bacpac方法建议用于150GB以下的数据库,更大的库优先选择事务复制
- 权限要求:需拥有两个订阅的Contributor权限,以及SQL Server和托管实例的管理员权限
内容的提问来源于stack exchange,提问作者achustle
相关产品推荐
相关产品推荐

