使用开放源代码工具将 Azure Database for MySQL - 单一服务器迁移到 Azure Database for MySQL - 灵活服务器

通过组合使用开放源代码工具(如 mydumper/myloader)与数据传入复制,可在最大程度减少应用程序故障时间的情况下,将 Azure Database for MySQL - 单一服务器迁移到 Azure Database for MySQL - 灵活服务器。

注意

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

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

如果设置了数据传入复制以将一个 Azure Database for MySQL 实例中的数据同步到另一个实例,则可以选择性地将应用程序从主服务器(或源数据库)切换到副本服务器(或目标数据库)。

在本教程中,你将使用 mydumper/myloader 和数据传入复制将示例数据库 (classicmodels) 从 Azure Database for MySQL - 单一服务器实例迁移到 Azure Database for MySQL - 灵活服务器实例,然后同步数据。

在本教程中,你将了解:

  • 如何为不同的方案配置用于数据传入复制的网络设置。
  • 如何配置主服务器与副本服务器之间的数据传入复制。
  • 如何测试复制。
  • 如何进行切换以完成迁移。

先决条件

要完成本教程,需要:

  • 运行版本 5.7 或 8.0 的 Azure Database for MySQL 单一服务器实例。

    注意

    如果运行的是 Azure Database for MySQL 单一服务器版本 5.6,请将实例升级到 5.7,然后配置数据传入复制。 有关详细信息,请参阅 Azure Database for MySQL - 单一服务器中的主版本升级

  • 一个 Azure Database for MySQL 灵活服务器实例。 有关详细信息,请参阅在 Azure Database for MySQL 灵活服务器中创建实例一文。

    注意

    不支持为区域冗余的高可用性服务器配置数据传入复制。 若要为目标服务器实现区域冗余的高可用性,请执行以下步骤:

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

    确保源和目标服务器上的 GTID_Mode 具有相同的设置

  • 使用 MySQL Workbench 连接和创建数据库。 有关详细信息,请参阅使用 MySQL Workbench 连接和查询数据一文。

  • 确保在托管源和目标数据库的同一区域中(或者在可进行私密访问的同一 VNet 中)有一个运行 Linux 的 Azure VM。

  • 在 Azure VM 上安装 mysql 客户端或 MySQL Workbench(客户端工具)。 确保可以连接到主服务器和副本服务器。 若要实现本文的目的,需要安装有 mysql 客户端。

  • 在 Azure VM 上安装 mydumper/myloader。 有关详细信息,请参阅 mydumper/myloader 一文。

  • 为源服务器上的 classicmodels 数据库下载并运行示例数据库脚本。

  • 在源服务器上配置 binlog_expire_logs_seconds 以确保在副本提交更改之前不会清除二进制日志。 转换成功后,可以重置值。

配置网络要求

若要配置数据传入复制,需确保目标可以通过端口 3306 连接到源。 根据源上设置的终结点类型执行以下相应步骤。

配置数据传入复制

若要配置数据传入复制,请执行以下步骤:

  1. 登录到安装了 mysql 客户端工具的 Azure VM。

  2. 使用 mysql 客户端工具连接到源和目标。

  3. 运行以下命令,使用 mysql 客户端工具确定是否在源上启用了 log_bin:

    SHOW VARIABLES LIKE 'log_bin';
    

    注意

    在具有较大存储的 Azure Database for MySQL 单一服务器(最多支持 16TB)中,默认已启用 log_bin。

    提示

    在 Azure Database for MySQL 单一服务器(最多支持 4TB)中,默认未启用 log_bin。 但是,如果提升源服务器的只读副本,然后删除只读副本,则该参数将设置为 ON。

  4. 根据源服务器的 SSL 强制设置,通过运行相应的命令在源服务器中创建拥有复制权限的用户。

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

    CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword';
    GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%' REQUIRE SSL;
    

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

    CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword';
    GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%';
    
  5. 若要使用 mydumper 备份数据库,请在安装了 mydumper\myloader 的 Azure VM 上运行以下命令:

    mydumper --host=<primary_server>.mysql.database.chinacloudapi.cn --user=<username>@<primary_server> --password=<Password> --outputdir=./backup --rows=100000 -G -E -R -z --trx-consistency-only --compress --build-empty-files --threads=16 --compress-protocol --ssl  --regex '^(classicmodels\.)' -L mydumper-logs.txt
    

    提示

    若要在创建备份时保持事务一致性,必须指定选项 --trx-consistency-only。

    • 该 mydumper 选项等效于 mysqldump 的 --single-transaction。
    • 如果所有表都是 InnoDB,则此选项十分有用。
    • “main”线程只需将全局锁保留到“dump”线程可以启动事务为止。
    • 提供全局锁定的最短持续时间

    “main”线程只需将全局锁保留到“dump”线程可以启动事务为止。

    下面解释了此命令中的变量:

    HOW-TO-MANAGE-FIREWALL-PORTAL --host:主服务器的名称

    • --user:用户名(由于主服务器正在运行 Azure Database for MySQL - 单一服务器,因此格式为 username@servername)。 可以使用服务器管理员或拥有 SELECT 和 RELOAD 权限的用户。
    • --Password:上述用户的密码

    有关使用 mydumper 的详细信息,请参阅 mydumper/myloader

  6. 通过运行以下命令,读取元数据文件以确定二进制日志文件名和偏移量:

    cat ./backup/metadata
    

    在此命令中,./backup 引用在上一步骤所述的命令中使用的输出目录。

    结果应如下图所示:

    使用 Azure 数据库迁移服务进行连续同步的屏幕截图。

    请务必记下二进制文件名,以供在后续步骤中使用。

  7. 通过运行以下命令,使用 myloader 还原数据库:

    myloader --host=<servername>.mysql.database.chinacloudapi.cn --user=<username> --password=<Password> --directory=./backup --queries-per-transaction=100 --threads=16 --compress-protocol --ssl --verbose=3 -e 2>myloader-logs.txt
    

    下面解释了此命令中的变量:

    • --host:副本服务器的名称
    • --user:用户名。 可以使用服务器管理员,或者拥有读/写权限的、能够将架构和数据还原到数据库的用户
    • --Password:上述用户的密码
  8. 根据主服务器上的 SSL 强制设置,使用 mysql 客户端工具连接到副本服务器并执行以下步骤。

    • 如果已启用 SSL 强制,请执行以下操作:

      i. 从此处下载通过 SSL 与 Azure Database for MySQL 服务器通信所需的证书。

      ii. 在记事本中打开证书文件,将内容粘贴到“PLACE YOUR PUBLIC KEY CERTIFICATE'S CONTEXT HERE”节中。

      SET @cert = '-----BEGIN CERTIFICATE-----
      PLACE YOUR PUBLIC KEY CERTIFICATE'S CONTEXT HERE
      -----END CERTIFICATE-----'
      

      iii. 若要配置数据传入复制,请运行以下命令:

      CALL mysql.az_replication_change_master('<Primary_server>.mysql.database.chinacloudapi.cn', '<username>@<primary_server>', '<Password>', 3306, '<File_Name>', <Position>, @cert);
      

      注意

      根据在步骤 6 中获取的信息确定位置和文件名。

    • 如果未启用 SSL 强制,请运行以下命令:

      CALL mysql.az_replication_change_master('<Primary_server>.mysql.database.chinacloudapi.cn', '<username>@<primary_server>', '<Password>', 3306, '<File_Name>', <Position>, '');
      
  9. 若要从副本服务器启动复制,请调用以下存储过程。

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

    show slave status \G;
    

    注意

    如果使用的是 MySQL Workbench,则 \G 修饰符不是必需的。

    如果 Slave_IO_Running 和 Slave_SQL_Running 的状态为 Yes,Seconds_Behind_Master 的值为 0,则表示复制工作正常 。 Seconds_Behind_Master 指示副本的滞后程度。 如果值不为 0,则表示副本正在处理更新。

测试复制(可选)

若要确认数据传入复制是否正常工作,可以验证对主服务器中的表所做的更改是否已复制到副本。

  1. 指定一个要用于测试的表(例如 Customers 表),然后在主服务器和副本服务器上运行以下命令,确认这两个服务器上该表包含的条目数是否相同:

    select count(*) from customers;
    
  2. 记下条目计数以便稍后进行比较。

    若要测试复制,请尝试将一些数据添加到主服务器上的客户表,然后确认是否复制了新数据。 在本例中,需将两行添加到主服务器上的表,然后确认这两行是否已复制到副本服务器。

  3. 在主服务器上的 Customers 表中,运行以下命令以插入行:

    insert  into `customers`(`customerNumber`,`customerName`,`contactLastName`,`contactFirstName`,`phone`,`addressLine1`,`addressLine2`,`city`,`state`,`postalCode`,`country`,`salesRepEmployeeNumber`,`creditLimit`) values
    (<ID>,'name1','name2','name3 ','11.22.5555','54, Add',NULL,'Add1',NULL,'44000','country',1370,'21000.00');
    
  4. 若要检查复制状态,请调用 show slave status \G 以确认复制是否按预期方式进行。

  5. 若要确认计数是否相同,请在副本服务器上运行以下命令:

    select count(*) from customers;
    

确保切换成功

为确保切换成功,请执行以下任务:

  1. 配置适当的服务器级防火墙和虚拟网络规则以连接到目标服务器。 可以在门户中比较源和目标的防火墙规则。
  2. 在目标服务器中配置适当的登录名和数据库级权限。 可以在源和目标服务器上运行 SELECT FROM mysql.user; 进行比较。
  3. 确保 Azure Database for MySQL 单一服务器的所有传入连接已停止。

    提示

    可将 Azure Database for MySQL 单一服务器设置为只读。

  4. 运行 show slave status \G 并确认 Seconds_Behind_Master 参数值为 0,确保副本服务器与主服务器已同步 。
  5. 将客户端和客户端应用程序重定向到 Azure Database for MySQL 灵活服务器的目标实例。
  6. 运行 mysql.az_replication_stop 存储过程(这会停止从副本服务器的复制)来执行最终切换。
  7. 调用 mysql.az_replication_remove_master 以删除数据传入复制配置。

此时,应用程序已连接到新的 Azure Database for MySQL 灵活服务器,并且源中的更改将不再复制到目标。 使用 Azure 门户创建和管理 Azure Database for MySQL 防火墙规则