复制或移动数据库 - Azure SQL 托管实例
- Artículo
-
-
适用于:Azure SQL 托管实例
本文介绍如何在 Azure SQL 托管实例中跨实例联机复制或移动数据库。 同一 Azure 租户中的不同 Azure 订阅都支持数据库复制和移动操作。
概述
可以使用 Always On 可用性组技术跨托管实例对数据库执行联机复制或移动操作。 复制和移动功能在目标实例上创建新数据库作为源数据库的副本。 使用此功能,数据复制是可靠的、异步的且近实时的。
复制数据库时,源数据库在操作完成期间和操作完成后保持联机状态。
反之,当移动数据库时,源数据库将在操作完成后被删除。
可以运行多个数据库复制和移动操作,从源托管实例到一个或多个目标实例。
复制和移动数据库不同于时间点还原 (PITR),因为它会在操作完成后创建数据库副本。 PITR 从过去的指定时刻创建数据库副本。
重要
当将数据库移动到新目标时,现有 PITR 备份不会随数据库一起移动,并且它们不可用。 移动操作完成时,数据库将在目标实例上启动新的备份链。
何时使用此功能
在需要执行以下操作时,移动或复制数据库非常有用:
- 管理数据库增长和性能要求。
- 跨多个托管实例平衡工作负载。
- 将数据库移动到具有更多可用资源的实例,以处理工作负载。
- 合并来自多个实例的多个数据库。
- 在开发、测试和生产环境之间创建数据库奇偶校验。
工作流
下面是复制或移动数据库的工作流:
选择数据库、源托管实例、目标实例,然后开始操作。
将数据库播种到目标服务器。 检查状态,以确定操作是否正在进行或者是否成功。
播种完成后,操作状态显示为准备完成。
在操作手动完成之前,对源数据库进行的所有更改都将应用于目标数据库。 可以随时取消操作。 可以在 24 小时内显式完成操作。 如果未在 24 小时内完成操作,则会自动取消该操作,并删除目标数据库。
手动完成操作后,目标数据库将处于联机状态,并准备好进行读/写工作负载。
如果选择移动数据库,则会删除源数据库。 如果选择复制数据库,源数据库将保持联机状态,但数据同步将停止。
下图演示了移动操作的示例工作流:
数据库移动操作的设计可确保不会丢失数据。 当用户完成移动操作时,源数据库将停止接受任何工作负荷,事务将副本到目标数据库。 只有这样,目标数据库才会联机,并且源数据库才会删除。 此设计可确保源数据库中的所有数据都移动到目标数据库。
数据库复制操作与数据库移动相似。 唯一的重要区别在于操作的结束方式。 完成数据库复制操作会停止将事务日志副本到目标数据库。 尽管用户显式发出命令来完成复制操作,但用户无法控制日志副本停止时的确切时刻。 最后,源数据库和目标数据库都处于联机状态、独立且可供读写工作负荷使用。
先决条件
在复制或移动数据库之前,必须满足以下要求:
- 必须对包含源托管实例的资源组具有读取权限,且必须在数据库级别对源实例和目标实例具有写入权限。
- 如果源实例和目标实例位于不同的虚拟网络中,则两个实例的虚拟网络之间必须存在网络连接,例如使用 Azure 虚拟网络对等互连。 此外,TCP 协议还需要允许端口 5022 和端口范围 11000-11999 上的入站和出站流量。 这适用于托管源实例和目标实例的两个子网。 若要了解详细信息,请查看如何在不同 Azure VNet 中的实例之间建立网络连接。
复制或移动数据库
可以使用 Azure 门户将数据库复制或移动到另一个托管实例。 为此,请执行以下操作:
在 Azure 门户中转到你的托管实例。
在数据管理下,选择数据库。
选择一个或多个数据库,然后选择窗格顶部的复制或移动选项。
选择移动将在操作完成时删除源数据库,而选择复制将在操作完成时使源数据库保持联机状态。 选择任一选项都将打开移动托管数据库或复制托管数据库页。 页面打开后,可以选择要包含在操作中的更多数据库。
在“源详细信息”窗格上,提供源数据库和托管实例的详细信息。
在目标详细信息窗格上,提供目标托管实例的详细信息。
选择查看 + 启动以验证源和目标详细信息,然后选择启动以开始操作。
选择启动将返回到实例的数据库页面,可以在其中监视操作的进度。
在数据库页上,检查操作详细信息列,验证操作的状态是否为正在移动或正在复制。
如果需要取消,选择正在使用的数据库,然后选择“取消操作”停止播种,并删除目标数据库。
监视操作。 播种完成后,操作详细信息列会显示移动准备完成或复制准备完成状态。
选择准备完成以打开操作详细信息列,选择准备复制或移动的数据库,然后选择完成以完成操作,使目标数据库处于联机状态。
在此期间,对源数据库所做的更改将被复制到目标数据库,直到选择完成。 如果未在 24 小时内完成操作,则会自动取消该操作,并删除目标数据库。 选择完成结束操作并返回数据库页面,确认操作已完成。
如果移动数据库,则数据库名称不可用,因为它现在处于脱机状态。
注意
对于跨订阅数据库复制和移动操作,请使用 Az.Sql PowerShell 模块版本 5.1 或更高版本。 在 Copy-AzSqlInstanceDatabase
中,参数 -TargetSubscriptionId
是可选的,仅跨订阅复制或移动操作需要。
使用 Azure PowerShell commandlet 启动、获取、完成或取消数据库复制或数据库移动操作。
下面是如何复制数据库的示例。
$dbName = "<database_name>"
$miName = "<source_managed_instance_name>"
$rgName = "<source_resource_group_name>"
$tmiName = "<target_managed_instance_name>"
$trgName = "<target_resource_group_name>"
## Parameter TargetSubscriptionId is optional and is needed only for cross-subscription copy or move operations.
$trgSubId = "<target_subscription_id>"
## Start database copy operation.
Copy-AzSqlInstanceDatabase -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName -TargetSubscriptionId $trgSubId
## Verify the operation status is succeeded.
Get-AzSqlInstanceDatabaseCopyOperation -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName
## Complete database copy operation.
Complete-AzSqlInstanceDatabaseCopy -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName -TargetSubscriptionId $trgSubId
## Verify the operation status is succeeded.
Get-AzSqlInstanceDatabaseCopyOperation -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName
下面是另一个说明如何启动和取消数据库移动的示例。
$dbName = "<database_name>"
$miName = "<source_managed_instance_name>"
$rgName = "<source_resource_group_name>"
$tmiName = "<target_managed_instance_name>"
$trgName = "<target_resource_group_name>"
## Parameter TargetSubscriptionId is optional and is needed only for cross-subscription copy or move operations.
$trgSubId = "<target_subscription_id>"
## Start database move operation.
Move-AzSqlInstanceDatabase -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName -TargetSubscriptionId $trgSubId
## Verify the operation status is succeeded.
Get-AzSqlInstanceDatabaseMoveOperation -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName
## Complete database copy operation.
Stop-AzSqlInstanceDatabaseMove -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName -TargetSubscriptionId $trgSubId
## Verify the operation status is succeeded.
Get-AzSqlInstanceDatabaseMoveOperation -DatabaseName $dbName -InstanceName $miName -ResourceGroupName $rgName -TargetInstanceName $tmiName -TargetResourceGroupName $trgName
注意
对于跨订阅数据库复制和移动操作,请使用 Azure CLI 版本 2.63.0 或更高版本。 在 az sql midb copy start
中,参数 --dest-sub-id
是可选的,仅跨订阅复制或移动操作需要。
使用 Azure CLI commandlet 启动、获取、完成或取消数据库复制或数据库移动操作。
下面是如何复制数据库的示例。
dbName="<database_name>"
miName="<source_managed_instance_name>"
rgName="<source_resource_group_name>"
subId="<source_subscription_id>"
destMiName="<target_managed_instance_name>"
destRgName="<target_resource_group_name>"
destSubId="<destination_subscription_id>"
az account set --subscription $subId
az sql midb copy start --name $dbName --resource-group $rgName --managed-instance $miName --dest-rg $destRgName --dest-mi $destMiName --dest-sub-id $destSubId
az sql midb copy list --name $dbName --resource-group $rgName --managed-instance $miName
az sql midb copy complete --name $dbName --resource-group $rgName --managed-instance $miName --dest-rg $destRgName --dest-mi $destMiName --dest-sub-id $destSubId
az sql midb copy list --name $dbName --resource-group $rgName --managed-instance $miName
下面是另一个说明如何启动和取消数据库移动的示例。
dbName="<database_name>"
miName="<source_managed_instance_name>"
rgName="<source_resource_group_name>"
subId="<source_subscription_id>"
destMiName="<target_managed_instance_name>"
destRgName="<target_resource_group_name>"
destSubId="<destination_subscription_id>"
az account set --subscription $subId
az sql midb move start --name $dbName --resource-group $rgName --managed-instance $miName --dest-rg $destRgName --dest-mi $destMiName --dest-sub-id $destSubId
az sql midb move list --name $dbName --resource-group $rgName --managed-instance $miName
az sql midb move cancel --name $dbName --resource-group $rgName --managed-instance $miName --dest-rg $destRgName --dest-mi $destMiName --dest-sub-id $destSubId
az sql midb move list --name $dbName --resource-group $rgName --managed-instance $miName
数据库复制和移动操作都有两个阶段。 第一个是初始种子设定,第二个是将更改从源数据库复制到目标数据库。 通常,初始种子设定是操作要求更高的阶段。 完成初始种子设定所需的时间取决于数据的大小以及活动复制或移动操作的数量。 源和目标 Azure SQL 托管实例上发生的工作负载强度以及源和目标之间的网络速度也会影响种子设定速度。 在最佳情况下,使用建议的全局 VNet 对等互连建立源和目标之间的连接时,种子设定速度高达每小时 360 GB。 可通过 DMV sys.dm_hadr_physical_seeding_stats 监视种子设定过程及其速度。
SELECT
role_desc,
transfer_rate_bytes_per_second,
transferred_size_bytes,
database_size_bytes,
start_time_utc,
estimate_time_complete_utc,
end_time_utc,
local_physical_seeding_id
FROM
sys.dm_hadr_physical_seeding_stats;
限制
考虑复制和移动功能的以下限制:
- 源实例和目标实例不能相同。
- 源实例和目标实例都必须位于同一 Azure 区域中。
- 只能复制和移动用户数据库。 不支持复制和移动系统数据库。
- 一个数据库一次只能参与一个移动或复制操作。
- 源实例一次最多可以运行八个复制或移动操作。 可以启动 8 个以上的操作,但某些由服务管理的操作将在稍后加入队列并进行处理。
- 在复制或移动操作期间,不能重命名数据库。
- 数据库标记不会随复制或移动操作一起复制。
- 数据库复制和移动操作不会复制或移动 PITR 备份。
- 不能复制或移动属于故障转移组或使用托管实例链接的数据库。
- 源托管实例或目标托管实例不应配置故障转移组(异地灾难恢复)设置。
- 在移动依赖于这些功能的数据库后,需要重新配置事务复制、变更数据捕获 (CDC) 或分布式事务。
- 当源数据库使用客户管理的密钥 (CMK) 作为 TDE 保护程序时,若要将数据库复制或移动到目标 SQL 托管实例,则目标实例必须有权访问 Azure Key Vault 中用于加密源数据库的同一密钥。
相关内容
更多与数据库复制和移动相关的文档。
对于其他数据移动选项,请查看: