使用 Azure Database for MySQL 导入 CLI 将 Azure Database for MySQL 单一服务器迁移灵活服务器

适用于: Azure Database for MySQL - 单一服务器

使用 Azure Database for MySQL 导入 CLI(正式发布版),可将 Azure Database for MySQL 从单一服务器无缝迁移到灵活服务器。 它使用快照备份和还原技术,提供简单快速的迁移路径来将源服务器的物理数据文件还原到目标服务器。 在执行导入操作之后,可以利用灵活服务器的优势,包括更好的性价比、对数据库配置的精细控制以及自定义维护时段。

根据用户输入,它负责预配目标灵活服务器,然后备份源服务器并还原目标。 它将数据文件、服务器参数、兼容的防火墙规则和服务器属性(层、版本、sku 名称、存储大小、位置、异地冗余备份、公共访问、标记、自动增长、备份保留天数、管理员用户和管理员密码)从单一服务器实例复制到灵活服务器实例。

Azure Database for MySQL 导入 CLI 首先执行脱机导入操作,使用户可以在源和目标之间设置数据传入复制以执行联机迁移,从而支持近乎零停机时间的迁移。

本教程展示如何使用 Azure Database for MySQL 导入 CLI 命令将 Azure Database for MySQL 单一服务器迁移到灵活服务器。

新增功能

  • 现在支持将 Azure Database for MySQL 导入操作用于带有旧版存储体系结构(常规用途存储 V1)的单一服务器。 对于带有旧版存储的单一服务器实例,在启动导入操作之前,需要设置参数 log_bin=ON。 为此,请为单一服务器实例创建只读副本,然后将其删除。 此操作会将参数 log_bin 设置为 ON,然后你可以触发导入操作来迁移到灵活服务器。 (2024 年 2 月)

本教程需要 Azure CLI 2.54.0 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI

安装

必须使用 az sign-in 命令登录帐户。 请注意 id 属性,该属性指的是 Azure 帐户的订阅 ID。

az login

使用 az account set 命令选择源 Azure Database for MySQL 单一服务器在帐户下位于的特定订阅。 请注意将 az login 输出中的 ID 值用作命令中 subscription 参数的值。 如果有多个订阅,请选择源 Azure Database for MySQL 单一服务器所在的相应订阅。 若要获取所有订阅,请使用 az account list

az account set --subscription <subscription id>

限制和先决条件

  • 如果源 Azure Database for MySQL 单一服务器具有引擎版本 v8.x,请确保将源服务器的 .NET 客户端驱动程序版本升级到 8.0.32,以避免迁移到灵活服务器后出现任何编码不兼容问题。

  • 源 Azure Database for MySQL 单一服务器和目标 Azure Database for MySQL 灵活服务器必须位于同一订阅、资源组、区域和同一 MySQL 版本上。 无法跨订阅、资源组、区域和版本导入。

  • Azure Database for MySQL 导入 CLI 支持的 MySQL 版本为 5.7 和 8.0。 如果在单一服务器上使用另一主要的 MySQL 版本,请确保在触发 import 命令之前升级单一服务器实例上的版本。

  • 如果 Azure Database for MySQL 单一服务器实例的服务器参数“lower_case_table_names”设置为 2,并且应用程序使用了分区表,那么导入操作将导致分区表损坏。 建议为 Azure Database for MySQL 单一服务器实例将“lower_case_table_names”设置为 1,以便继续执行不会造成损坏的 MySQL 导入操作。

  • 不支持导入到现有 Azure MySQL 灵活服务器。 CLI 命令会启动新的 Azure MySQL 灵活服务器的导入。

  • 如果在更新 CLI 命令参数时将灵活目标服务器预配为非 HA(禁用高可用性),以后可将其切换到同区域 HA,但不能切换到区域冗余 HA。

  • 对于启用了 CMK 的单一服务器实例,Azure Database for MySQL 导入命令要求提供必需的输入参数,以便在目标灵活服务器上启用 CMK。

  • 如果单一服务器实例启用了“查询存储”,建议在目标灵活服务器实例上启用慢查询日志来支持类似的功能。 你可按照此处的步骤在目标灵活服务器上配置慢查询日志。 然后,可以使用工作簿模板查看查询见解。

  • 使用虚拟网络 (VNet) 和 Azure Database for MySQL 导入 CLI 时的重要注意事项:- 避免在 VNet 上执行并发操作:执行导入操作时,请不要在同一 VNet 上执行任何其他操作。 如果正在进行其他操作,请等待它们完全完成后再开始导入操作。 此操作可防止任何潜在的冲突或资源争用。- 限制同时迁移服务器:如果计划迁移驻留在同一 VNet 下的多台服务器,请不要同时启动这些迁移。 执行此操作可能会导致 VNet 中的操作受到阻止,从而导致等待时间延长甚至超时。

  • 如果单一服务器实例具有旧版存储体系结构(常规用途存储 V1),则需要在启动导入操作之前为单一服务器实例设置参数 log_bin=ON。 为此,请为单一服务器实例创建只读副本,然后将其删除。 此操作会将参数 log_bin 设置为 ON,然后你可以触发导入操作来迁移到灵活服务器。

  • 如果单一服务器实例具有引擎版本 v8.0,请考虑执行以下操作,以避免由于单一服务器实例与灵活服务器实例之间的社区次要版本差异而发生任何中断性变更:

    • 运行以下语句,检查实例是否可能受到错误直方图信息的影响。 如果输出相应的表,建议参考 https://dev.mysql.com/blog-archive/histogram-statistics-in-mysql/ 来删除直方图信息,然后在灵活服务器上重新创建它。 值得注意的是,直方图 inf 只是有关列的统计信息,此信息仅存在于系统表中,因此删除直方图信息不会影响表数据。

          SELECT DISTINCT SCHEMA_NAME, TABLE_NAME FROM `information_schema`.`column_statistics`;
      
    • 运行以下命令,检查可能具有其表列顺序的表是否混乱。 如果此检查标识了任何受影响的表,则需要转储这些表中的所有数据,然后将其导入回去。 如果不这样做,可能会导致 binlog 中的列序列与用户表中的列序列不匹配。 这种差异可以防止用户设置复制、还原数据、启用高可用性 (HA) 和其他操作。

          SELECT table_schema, table_name, COUNT(*) AS column_count, MAX(ORDINAL_POSITION) AS max_ordinal_position
          FROM information_schema.columns
          GROUP BY table_schema, table_name
          HAVING column_count != max_ordinal_position;
      
  • 仅支持实例级导入。 未提供用于在实例中导入所选数据库的选项。

  • 用户在执行导入操作后应将以下项从源复制到目标:

    • 只读副本
    • 监视页面设置(警报、指标和诊断设置)
    • 你托管的用于管理单一服务器实例的任何 Terraform/CLI 脚本都应使用灵活服务器引用进行更新

触发 Azure Database for MySQL 导入操作,以便从 Azure Database for MySQL 单一服务器迁移到灵活服务器

使用 az mysql flexible-server import create 命令触发 Azure Database for MySQL 导入操作。 以下命令会创建一个目标灵活服务器,并使用 Azure CLI 本地上下文中的服务默认设置和值执行从源到目标的实例级导入:

az mysql flexible-server import create --data-source-type
                                --data-source
                                --resource-group
                                --name
                                [--sku-name]
                                [--tier]
                                [--version]
                                [--storage-size]
                                [--mode]
                                [--admin-password]
                                [--admin-user]
                                [--auto-scale-iops {Disabled, Enabled}]
                                [--backup-identity]
                                [--backup-key]
                                [--backup-retention]
                                [--database-name]
                                [--geo-redundant-backup {Disabled, Enabled}]
                                [--high-availability {Disabled, SameZone, ZoneRedundant}]
                                [--identity]
                                [--iops]
                                [--key]
                                [--location]
                                [--private-dns-zone]
                                [--public-access]
                                [--resource-group]
                                [--standby-zone]
                                [--storage-auto-grow {Disabled, Enabled}]
                                [--subnet]
                                [--subnet-prefixes]
                                [--tags]
                                [--vnet]
                                [--zone]

以下示例获取名为“test-single-server”的单一服务器的数据源信息和目标灵活服务器信息,在 chinanorth3 位置(即源单一服务器所在位置)创建一个名为 test-flexible-server 的目标灵活服务器,并执行从源到目标的导入。 如果没有向 CLI 命令提供输入,则 Azure Database MySQL 导入命令会跨相应的 tier、version、sku-name、storage-size、location、geo-redundant-backup、public-access、tags、auto grow、backup-retention-days、admin-user 和 admin-password 属性从单一服务器映射到灵活服务器(作为智能默认设置)。 可通过为这些可选参数提供输入来选择替代智能默认设置。

az mysql flexible-server import create --data-source-type "mysql_single" --data-source "test-single-server" --resource-group "test-rg"  --name "test-flexible-server"

以下示例采用名为“test-single-server”的单一服务器的数据源信息和目标灵活服务器信息,在 chinanorth3 位置(即源单一服务器所在位置)创建一个名为 test-flexible-server 的目标灵活服务器(启用“区域冗余”并使用虚拟网络集成),并执行从源到目标的导入。 在此处详细了解虚拟网络配置。

# create vnet
az network vnet create --resource-group testGroup --name myVnet --location testLocation --address-prefixes 172.0.0.0/16

# create subnet
az network vnet subnet create --resource-group testGroup --vnet-name myVnet --address-prefixes 172.0.0.0/24 --name mySubnet

# create private dns zone
az network private-dns zone create -g testGroup -n myserver.private.contoso.com

# trigger mysql import
az mysql flexible-server import create --data-source-type "mysql_single" --data-source "test-single-server" --resource-group "test-rg"  --name "test-flexible-server" --high-availability ZoneRedundant --zone 1 --standby-zone 3  --vnet "myVnet" --subnet "mySubnet" --private-dns-zone "myserver.private.contoso.com"

以下示例采用名为“test-single-server”且启用客户托管密钥 (CMK) 的单一服务器的数据源信息和目标灵活服务器信息,创建名为 test-flexible-server 的目标灵活服务器,并执行从源到目标的导入。 对于启用了 CMK 的单一服务器实例,Azure Database for MySQL 导入命令要求提供必需的输入参数来启用 CMK:--key keyIdentifierOfTestKey --identity testIdentity。

# create keyvault
az keyvault create -g testGroup -n testVault --location testLocation \
  --enable-purge-protection true

# create key in keyvault and save its key identifier
keyIdentifier=$(az keyvault key create --name testKey -p software \
  --vault-name testVault --query key.kid -o tsv)

# create identity and save its principalId
identityPrincipalId=$(az identity create -g testGroup --name testIdentity \
  --location testLocation --query principalId -o tsv)

# add testIdentity as an access policy with key permissions 'Wrap Key', 'Unwrap Key', 'Get' and 'List' inside testVault
az keyvault set-policy -g testGroup -n testVault --object-id $identityPrincipalId \
  --key-permissions wrapKey unwrapKey get list

# trigger azure database for mysql import for CMK enabled single server
az mysql flexible-server import create --data-source-type "mysql_single" --data-source "test-single-server" --resource-group "test-rg"  --name "test-flexible-server" --key $keyIdentifier --identity testIdentity

下面是上述参数的详细信息:

设置 示例值 说明
data-source-type mysql_single 用作触发 Azure Database for MySQL 导入操作的源目标的数据源类型。 接受的值:[mysql_single]。 关于接受的值 (mysql_single) 的说明:Azure Database for MySQL 单一服务器。
data-source test-single-server 源 Azure Database for MySQL 单一服务器的名称或资源 ID。
resource-group test-rg 源 Azure Database for MySQL 单一服务器的 Azure 资源组的名称。
mode 离线 Azure Database for MySQL 导入模式。 接受的值:[脱机];默认值:脱机。
location chinanorth3 源 Azure Database for MySQL 单一服务器的 Azure 位置。
name test-flexible-server 输入目标 Azure Database for MySQL 灵活服务器的唯一名称。 服务器名称只能包含小写字母、数字和连字符 (-) 字符。 必须包含 3 到 63 个字符。 注意:此服务器与源部署在相同的订阅、资源组和区域中。
admin-user adminuser 目标 Azure Database for MySQL 灵活服务器的管理员登录用户名。 它不能为“azure_superuser”、“admin”、“administrator”、“root”、“guest”或“public” 。
admin-password password 目标 Azure Database for MySQL 灵活服务器的管理员用户密码。 该密码必须包含 8 到 128 个字符。 密码必须含以下字符类别中的三类:英文大写字母、英文小写字母、数字和非字母数字字符。
sku-name GP_Gen5_2 输入目标 Azure Database for MySQL 灵活服务器的定价层和计算配置的名称。 请遵循简写约定 {pricing tier} {compute generation} {vCores}。 有关详细信息,请参阅定价层
可突发 目标 Azure Database for MySQL 灵活服务器的计算层。 接受的值:可突发、常用用途、内存优化;默认值:可突发。
public-access 0.0.0.0 确定目标 Azure Database for MySQL 灵活服务器的公共访问权限。 输入要包含在 IP 允许列表中的单个或一系列 IP 地址。 IP 地址范围必须用短划线分隔,并且不包含任何空格。 如果指定 0.0.0.0,则允许从 Azure 中部署的任何资源进行公共访问来访问服务器。 如果将其设置为“无”,则会将服务器设置为公共访问模式,但不创建防火墙规则。
vnet myVNet 新的或现有的虚拟网络的名称或 ID。 如果要使用不同资源组或订阅中的 vnet,请提供资源 ID。 名称必须包含 2 到 64 个字符。 名称必须以字母或数字开头,以字母、数字或下划线结尾,并且只能包含字母、数字、下划线、句点或连字符。
subnet mySubnet 新的或现有的子网的名称或资源 ID。 如果要使用不同资源组或订阅中的子网,请提供资源 ID 而不是名称。 子网将委托给 flexibleServers。 进行委托后,此子网不能用于任何其他类型的 Azure 资源。
private-dns-zone myserver.private.contoso.com 新的或现有的专用 DNS 区域的名称或 ID。 可以使用同一资源组、不同资源组或不同订阅中的专用 DNS 区域。 如果要使用不同资源组或订阅中的区域,请提供资源 ID。 如果用户未提供专用 DNS 区域,CLI 会在虚拟网络所在的资源组中新建一个该区域。
key testKey 的密钥标识符 用于数据加密的主密钥库密钥的资源 ID。
identity testIdentity 用于数据加密的用户分配的标识的名称或资源 ID。
storage-size 32 目标 Azure Database for MySQL 灵活服务器的存储容量。 最小值为 20 GiB,最大值为 16 TiB。
标记 key=value 提供 Azure 资源组的名称。
版本 5.7 目标 Azure Database for MySQL 灵活服务器的服务器主版本。
高可用性 ZoneRedundant 启用(ZoneRedundant 或 SameZone)或禁用目标 Azure Database for MySQL 灵活服务器的高可用性功能。 接受的值:已禁用、同区域、区域冗余;默认值:已禁用。
区域 1 要在其中预配资源的可用性区域。
standby-zone 3 启用高可用性时备用服务器的可用性区域信息。
storage-auto-grow 已启用 启用或禁用目标 Azure Database for MySQL 灵活服务器的存储自动增长。 默认值为“已启用”。 接受的值:已禁用、已启用;默认值:已启用。
iops 500 要为目标 Azure Database for MySQL 灵活服务器分配的 IOPS 数目。 根据预配的计算和存储,可以获得一定数量的空闲 IOPS。 IOPS 的默认值为“空闲 IOPS”。 若要详细了解基于计算和存储的 IOPS,请参阅“Azure Database for MySQL 灵活服务器中的 IOPS”。

脱机迁移的步骤

完成上述 Azure Database for MySQL 导入操作后:

  • 登录到目标 Azure Database for MySQL 灵活服务器并运行以下命令,获取与 Azure Database for MySQL 导入CLI 用于还原到目标服务器的备份快照相对应的箱日志文件名和位置。
CALL mysql.az_show_binlog_file_and_pos_for_mysql_import();
  • 按照此处列出的步骤,使用箱日志位置在源服务器和目标服务器实例之间设置数据传入复制,当复制状态反映目标服务器已与源同步时,则停止复制并执行直接转换。

配置 Azure Database for MySQL 导入 CLI 命令参数的最佳做法

在触发 Azure Database for MySQL 导入 CLI 命令之前,请考虑以下参数配置指南,以帮助确保使用 Azure Database for MySQL 导入 CLI 更快地加载数据。

  • 如果要替代智能默认值,请按照下表中的详细信息,根据源单一服务器的定价层和 VCore 数为目标灵活服务器选择计算层和 SKU 名称。

    单一服务器定价层 单一服务器 VCore 数 灵活服务器层级 灵活服务器 SKU 名称
    基本 1 可突发 Standard_B2ms
    基本 2 可突发 Standard_B2ms
    常规用途 4 常规用途 Standard_D4ds_v4
    常规用途 8 常规用途 Standard_D8ds_v4
    常规用途 16 常规用途 Standard_D16ds_v4
    常规用途 32 常规用途 Standard_D32ds_v4
    常规用途 64 常规用途 Standard_D64ds_v4
    内存优化 4 内存优化 Standard_E4ds_v4
    内存优化 8 内存优化 Standard_E8ds_v4
    内存优化 16 内存优化 Standard_E16ds_v4
    内存优化 32 内存优化 Standard_E32ds_v4
  • 目标灵活服务器的 MySQL 版本、区域、订阅和资源必须与源单一服务器的相同。

  • 目标灵活服务器的存储大小应等于或大于源单一服务器上的存储大小。

Azure Database for MySQL 导入迁移单一服务器实例需要多长时间?

下面是基于常规用途 V2 存储体系结构的存储大小的基准性能。 (具有常规用途 V1 存储的服务器将需要更长的时间进行迁移,因为它也涉及升级存储体系结构)

单一服务器存储大小 导入时间
1 GiB 0 分 23 秒
10 GiB 4 分 24 秒
100 GiB 10 分 29 秒
500 GiB 13 分 15 秒
1 TB 22 分 56 秒
10 TB 2 小时 5 分 30 秒

从上表中看,随着存储大小的增加,数据复制所需的时间也会增加,几乎呈线性相关。 但是,请务必注意,网络波动可能会显著影响复制速度。 因此,此处提供的数据应仅作为参考。

下面是基于 10 GiB 存储大小的不同数量的表的基准性能。

单一服务器实例中的表数 导入时间
100 4 分 24 秒
200 4 分 40 秒
800 4 分 52 秒
14,400 17 分 41 秒
28,800 19 分 18 秒
38,400 22 分 50 秒

随着文件数量的增加,数据库中的每个文件/表可能都会变得非常小。 这将导致传输的数据量一致,但会更频繁地执行与文件相关的操作,而这可能会影响 Azure Database for MySQL 导入的性能。

导入后采取的步骤

  • Azure Database for MySQL 导入操作成功完成后,将以下属性从源单一服务器复制到目标灵活服务器:
    • 只读副本
    • event_scheduler 的服务器参数值
    • 监视页面设置(警报、指标和诊断设置)
    • 你托管的用于管理单一服务器实例的任何 Terraform/CLI 脚本都应使用灵活服务器引用进行更新。

下一步