使用数据传入复制将 Amazon RDS for MySQL 迁移到 Azure Database for MySQL

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

重要

Azure Database for MySQL 单一服务器即将停用。 强烈建议升级到 Azure Database for MySQL 灵活服务器。 有关如何迁移到 Azure Database for MySQL 灵活服务器的详细信息,请参阅 Azure Database for MySQL 单一服务器发生了什么情况?

注意

本文包含对术语“从属”的引用,这是 Microsoft 不再使用的术语。 在从软件中删除该术语后,我们会将其从本文中删除。

可以使用 MySQL 转储和还原、MySQL Workbench 导出和导入或 Azure 数据库迁移服务等方法,将 MySQL 数据库迁移到 Azure Database for MySQL 灵活服务器。 可以通过将 mysqldump 或 mydumper 和 myloader 等开源工具和数据传入复制结合使用,在尽量减少停机时间的情况下迁移工作负荷。

数据传入复制是基于二进制日志文件定位方法将源服务器中的数据更改复制到目标服务器的技术。 在此方案中,作为源(数据库更改的来源位置)运行的 MySQL 实例将更新和更改作为“事件”写入二进制日志。 二进制日志中的信息根据所记录的数据库更改以不同的日志记录格式进行存储。 副本配置为从源读取二进制日志,并执行副本的本地数据库上的二进制日志中的事件。

设置数据传入复制,以将数据从源 MySQL 服务器同步到目标 MySQL 服务器。 可以选择性地将应用程序从主服务器(或源数据库)直接转换到副本服务器(或目标数据库)。

本教程介绍如何在运行 Amazon Relational Database Service (RDS) for MySQL 的源服务器和运行 Azure Database for MySQL 灵活服务器的目标服务器之间设置数据传入复制。

性能注意事项

在开始本教程之前,请考虑用于执行操作的客户端计算机的位置和容量对性能的影响。

客户端位置

从与数据库服务器在同一位置启动的客户端计算机执行转储或还原操作:

  • 对于 Azure Database for MySQL 灵活服务器实例,客户端计算机应与目标数据库服务器位于同一虚拟网络和同一可用性区域中。
  • 对于源 Amazon RDS 数据库实例,客户端实例应与源数据库服务器位于同一 Amazon 虚拟私有云和可用性区域中。 在上述情况下,可以使用文件传输协议(例如 FTP 或 SFTP)在客户端计算机之间移动转储文件,或将转储文件上传到 Azure Blob 存储。 为了减少总迁移时间,请在传输文件之前对其进行压缩。

客户端容量

无论客户端计算机位于何处,它都需要足够的计算、I/O 和网络容量来执行请求的操作。 一般建议:

  • 如果转储或还原涉及到数据的实时处理(例如压缩或解压缩),请选择至少为每个转储或还原线程提供一个 CPU 核心的实例类。
  • 确保有足够的网络带宽可供客户端实例使用。 使用支持加速网络功能的实例类型。 有关详细信息,请参阅 Azure 虚拟机网络指南中的“加速网络”部分。
  • 确保客户端计算机的存储层提供所需的读/写容量。 我们建议使用具有高级 SSD 存储的 Azure 虚拟机。

先决条件

要完成本教程,需要:

  • 在客户端计算机上安装 mysqlclient,以在目标 Azure Database for MySQL 灵活服务器实例上创建转储并执行还原操作。

  • 对于较大的数据库,请安装 mydumper 和 myloader 以并行转储和还原数据库。

    注意

    Mydumper 只能在 Linux 发行版上运行。 有关详细信息,请参阅如何安装 mydumper

  • 创建运行版本 5.7 或 8.0 的 Azure Database for MySQL 灵活服务器实例。

    重要

    如果目标是具有区域冗余高可用性 (HA) 的 Azure Database for MySQL 灵活服务器,请注意此配置不支持数据传入复制。 解决方法是在创建服务器期间设置区域冗余 HA:

    1. 创建已启用区域冗余高可用性的服务器。
    2. 禁用高可用性。
    3. 遵循本文设置数据传入复制。
    4. 切换后删除数据传入复制配置。
    5. 启用高可用性。

确保正确配置并设置多个参数和功能,如下所述:

  • 出于兼容性原因,将源和目标数据库服务器置于相同的 MySQL 版本上。
  • 在每个表中提供主键。 表中缺少主键可能会减慢复制速度。
  • 确保源数据库和目标数据库的字符集相同。
  • wait_timeout 参数设置为合理的时间。 该时间取决于要导入或迁移的数据或工作负载数量。
  • 验证所有表是否都使用 InnoDB。 Azure Database for MySQL 灵活服务器仅支持 InnoDB 存储引擎。
  • 对于具有多个辅助索引的表或大的表,性能开销影响在还原期间可见。 请修改转储文件,使 CREATE TABLE 语句不包括辅助键定义。 在导入数据后重新创建辅助索引,以避免在还原期间出现性能损失。

最后,若要准备数据传入复制,请执行以下操作:

  • 验证目标 Azure Database for MySQL 灵活服务器实例能否通过端口 3306 连接到源 Amazon RDS for MySQL 服务器。
  • 确保源 Amazon RDS for MySQL 服务器允许端口 3306 上的入站和出站流量。
  • 确保使用 Azure ExpressRouteAzure VPN 网关来提供与源服务器的站点到站点连接。 有关创建虚拟网络的详细信息,请参阅 Azure 虚拟网络文档。 另请参阅提供了分布详细信息的快速入门文章。
  • 配置源数据库服务器的网络安全组,以允许目标 Azure Database for MySQL 灵活服务器 IP 地址。

重要

如果源 Amazon RDS for MySQL 实例的 GTID_mode 设置为 ON,则 Azure Database for MySQL 灵活服务器目标实例的 GTID_mode 也必须设置为 ON。

配置 Azure Database for MySQL 的目标实例

若要配置 Azure Database for MySQL 灵活服务器的目标实例(数据传入复制的目标),请执行以下步骤:

  1. max_allowed_packet 参数值设置为最大值 1073741824(即 1 GB)。 此值可以防止出现任何与长行相关的溢出问题。

  2. 在迁移期间将 slow_query_loggeneral_logaudit_log_enabledquery_store_capture_mode 参数设置为 OFF,以帮助消除任何与查询日志记录相关的开销。

  3. 将目标 Azure Database for MySQL 灵活服务器实例的计算大小纵向扩展为最多 64 个 vCore。 此大小在还原源服务器的数据库转储时提供额外的计算资源。

    迁移完成后,始终可以根据应用程序需求缩减计算。

  4. 纵向扩展存储大小,以便在迁移期间获得更多的 IOPS,或增加用于迁移的最大 IOPS。

    注意

    可用的最大 IOPS 取决于计算大小。 有关详细信息,请参阅 Azure Database for MySQL 灵活服务器中的计算和存储选项中的“IOPS”部分。

配置源 Amazon RDS for MySQL 服务器

若要准备和配置 Amazon RDS 中托管的 MySQL 服务器(数据传入复制的“源”),请执行以下步骤:

  1. 确认是否在源 Amazon RDS for MySQL 服务器上启用了二进制日志记录。 检查是否已启用自动备份,或确保源 Amazon RDS for MySQL 服务器存在只读副本。

  2. 确保源服务器上的二进制日志文件保留到在 Azure Database for MySQL 灵活服务器的目标实例上应用了更改为止。

    如果使用数据传入复制,则 Azure Database for MySQL 灵活服务器无需管理复制过程。

  3. 若要检查源 Amazon RDS 服务器上的二进制日志保留期以确定二进制日志的保留小时数,请调用 mysql.rds_show_configuration 存储过程:

    mysql> call mysql.rds_show_configuration;
    +------------------------+-------+-----------------------------------------------------------------------------------------------------------+
    | name | value | description |
    +------------------------+-------+-----------------------------------------------------------------------------------------------------------+
    | binlog retention hours | 24 | binlog retention hours specifies the duration in hours before binary logs are automatically deleted. |
    | source delay | 0 | source delay specifies replication delay in seconds between current instance and its master. |
    | target delay | 0 | target delay specifies replication delay in seconds between current instance and its future read-replica. |
    +------------------------+-------            +-----------------------------------------------------------------------------------------------------------+
    3 rows in set (0.00 sec)
    
  4. 若要配置二进制日志保留期,请运行 rds_set_configuration 存储过程,以确保在源服务器上将二进制日志保留所需的时间。 例如:

    Mysql> Call mysql.rds_set_configuration(‘binlog retention hours', 96);
    

    如果你要创建转储并进行还原,则上述命令可帮助你快速与增量更改同步。

    注意

    确保有足够的磁盘空间用于根据定义的保留期在源服务器上存储二进制日志。

可通过两种方法从源 Amazon RDS for MySQL 服务器捕获数据转储。 其中一种方法涉及到直接从源服务器捕获数据转储。 而另一种方法涉及到从 Amazon RDS for MySQL 只读副本捕获转储。

  • 若要直接从源服务器捕获数据转储,请执行以下操作:

    1. 确保停止从应用程序写入几分钟,以获取事务性一致性数据转储。

      还可以暂时将 read_only 参数设置为值 1,以便在捕获数据转储时不会处理写入。

    2. 停止源服务器上的写入后,通过运行命令 Mysql> Show master status; 来收集二进制日志文件名称和偏移量。

    3. 保存这些值,以从 Azure Database for MySQL 灵活服务器实例启动复制。

    4. 若要创建数据转储,请运行以下命令执行 mysqldump

      $ mysqldump -h hostname -u username -p -single-transaction -databases dbnames -order-by-primary> dumpname.sql
      
  • 如果无法停止源服务器上的写入,或者在源服务器上转储数据造成的性能影响不可接受,请捕获副本服务器上的转储:

    1. 使用与源服务器相同的配置创建 Amazon MySQL 只读副本。 然后在该副本中创建转储。

    2. 让 Amazon RDS for MySQL 只读副本与源 Amazon RDS for MySQL 服务器同步。

    3. 如果只读副本上的副本滞后时间达到 0,请调用 mysql.rds_stop_replication 存储过程来停止复制。

      Mysql> call mysql.rds_stop_replication;
      
    4. 复制停止后,连接到副本。 然后运行 SHOW SLAVE STATUS 命令从 Relay_Master_Log_File 字段检索当前二进制日志文件名称,并从 Exec_Master_Log_Pos 字段检索日志文件位置。

    5. 保存这些值,以从 Azure Database for MySQL 灵活服务器实例启动复制。

    6. 若要从 Amazon RDS for MySQL 只读副本创建数据转储,请运行以下命令执行 mysqldump

      $ mysqldump -h hostname -u username -p -single-transaction -databases dbnames -order-by-primary> dumpname.sql
      

    注意

    还可以使用 mydumper 从源 Amazon RDS for MySQL 数据库捕获数据的并行化转储。 有关详细信息,请参阅使用 mydumper/myloader 将大型数据库迁移到 Azure Database for MySQL 灵活服务器

  1. 若要使用 mysql 本机还原来还原数据库,请运行以下命令:

    $ mysql -h <target_server> -u <targetuser> -p < dumpname.sql
    
  2. 登录到源 Amazon RDS for MySQL 服务器,并设置复制用户。 然后向此用户授予所需的特权。

    • 如果使用 SSL,请运行以下命令:

      Mysql> CREATE USER 'syncuser'@'%' IDENTIFIED BY 'userpassword';
      Mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'syncuser'@'%' REQUIRE SSL;
      Mysql> SHOW GRANTS FOR syncuser@'%';
      
    • 如果未使用 SSL,请运行以下命令:

      Mysql> CREATE USER 'syncuser'@'%' IDENTIFIED BY 'userpassword';
      Mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'syncuser'@'%';
      Mysql> SHOW GRANTS FOR syncuser@'%';
      

    存储过程执行所有数据传入复制函数。 有关所有过程的信息,请参阅数据传入复制存储过程。 可以在 MySQL shell 或 MySQL Workbench 中运行这些存储过程。

  3. 若要链接 Amazon RDS for MySQL 源服务器和 Azure Database for MySQL 灵活服务器目标服务器,请登录到目标 Azure Database for MySQL 灵活服务器实例。 运行以下命令将 Amazon RDS for MySQL 服务器设置为源服务器:

    CALL mysql.az_replication_change_master('source_server','replication_user_name','replication_user_password',3306,'<master_bin_log_file>',master_bin_log_position,'<master_ssl_ca>');
    
  4. 若要在源 Amazon RDS for MySQL 服务器和目标 Azure Database for MySQL 灵活服务器实例之间开始复制,请运行以下命令:

    Mysql> CALL mysql.az_replication_start;
    
  5. 若要检查复制状态,请在副本服务器上运行以下命令:

    Mysql> show slave status\G
    

    如果 Slave_IO_RunningSlave_SQL_Running 参数的状态为 Yes,则表示复制已启动并处于运行中状态。

  6. 检查 Seconds_Behind_Master 参数的值以确定目标服务器的延迟程度。

    如果该值为 0,则表示目标已处理来自源服务器的所有更新。 如果该值不为 0,则表示目标服务器仍在处理更新。

确保切换成功

若要确保切换成功,请执行以下操作:

  1. 在目标 Azure Database for MySQL 灵活服务器实例中配置适当的登录名和数据库级权限。
  2. 停止向源 Amazon RDS for MySQL 服务器的写入。
  3. 确保目标 Azure Database for MySQL 灵活服务器实例已与源服务器同步,并且 show slave status 返回的 Seconds_Behind_Master 值为 0
  4. 调用存储过程 mysql.az_replication_stop 以停止复制,因为所有更改已复制到目标 Azure Database for MySQL 灵活服务器实例。
  5. 调用 mysql.az_replication_remove_master 以删除数据传入复制配置。
  6. 将客户端和客户端应用程序重定向到目标 Azure Database for MySQL 灵活服务器实例。

此时迁移已完成。 你的应用程序已连接到运行 Azure Database for MySQL 灵活服务器的服务器。