如何配置 Azure Database for MySQL - 灵活服务器数据传入复制

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

本文介绍如何通过配置源服务器和副本服务器在 Azure Database for MySQL 灵活服务器中设置数据传入复制。 本文假设读者在 MySQL 服务器和数据库方面有一定的经验。

注意

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

若要在 Azure Database for MySQL 灵活服务器实例中创建副本,数据传入复制需同步本地 MySQL 源服务器、虚拟机 (VM) 或云数据库服务中的数据。 可以使用基于二进制日志 (binlog) 文件位置的复制或基于 GTID 的复制来配置数据传入复制。 要了解有关 binlog 复制的详细信息,请参阅 MySQL 复制

在执行本文中的步骤之前,请查看数据传入复制的限制和要求

创建要用作副本的 Azure Database for MySQL 灵活服务器实例

  1. 创建一个新的 Azure Database for MySQL 灵活服务器实例(例如 replica.mysql.database.chinacloudapi.cn)。 请参阅使用 Azure 门户创建 Azure Database for MySQL 灵活服务器实例以进行服务器创建。 此服务器是数据传入复制的“副本”服务器。

  2. 创建相同的用户帐户和对应的特权。

    用户帐户不会从源服务器复制到副本服务器。 如果你打算为用户提供访问副本服务器的权限,则需在这个新创建的 Azure Database for MySQL 灵活服务器实例上手动创建所有帐户和相应的特权。

配置源 MySQL 服务器

以下步骤准备并配置本地或虚拟机中托管的 MySQL 服务器或其他云提供程序托管的数据库服务,以便进行数据传入复制。 该服务器是数据传入复制的“源”。

  1. 请先查看源服务器要求,然后再继续。

  2. 网络要求

    • 请确保源服务器允许端口 3306 上的入站和出站流量,并且源服务器具有公共 IP 地址,DNS 可供公开访问,或者 DNS 具有完全限定的域名 (FQDN)。

    • 如果使用的是专用访问(VNet 集成),请确保源服务器与托管副本服务器的 Vnet 之间已建立连接。

    • 请确保使用 ExpressRouteVPN 提供与本地源服务器的站点到站点连接。 有关创建虚拟网络的详细信息,请参阅虚拟网络文档,尤其是提供了分步详细信息的快速入门文章。

    • 如果在副本服务器中使用了专用访问(VNet 集成),并且源是 Azure VM,请确保已建立 VNet 到 VNet 的连接。 支持 VNet-Vnet 对等互连。 也可以使用其他连接方法跨不同区域在 Vnet 之间进行通信,例如 VNet 到 VNet 连接。 有关详细信息,请参阅 VNet 到 VNet VPN 网关

    • 确保虚拟网络网络安全组规则不会阻止出站端口 3306(如果 MySQL 在 Azure VM 上运行,也请确保不会阻止入站端口)。 有关虚拟网络 NSG 流量筛选的更多详细信息,请参阅使用网络安全组筛选网络流量一文。

    • 将源服务器的防火墙规则配置为允许副本服务器 IP 地址。

  3. 根据要使用基于 bin-log 位置还是基于 GTID 的数据传入复制来执行相应的步骤。

    运行以下命令以检查是否已在源服务器上启用了二进制日志记录:

    SHOW VARIABLES LIKE 'log_bin';
    

    如果返回了值为“ON”的变量 log_bin,则表示已在服务器上启用了二进制日志记录。

    如果返回了值为“OFF”的 log_bin,且源服务器在本地或虚拟机(在其中你可以访问配置文件 (my.cnf))上运行,则可以执行以下步骤:

    1. 在源服务器中找到 MySQL 配置文件 (my.cnf)。 例如:/etc/my.cnf

    2. 打开配置文件进行编辑,并在文件中找到“mysqld”部分。

    3. 在 mysqld 部分中,添加以下行:

      log-bin=mysql-bin.log
      
    4. 重启源服务器上的 MySQL 服务(或重启)以使更改生效。

    5. 重启服务器后,运行与之前相同的查询来验证是否已启用二进制日志记录:

      SHOW VARIABLES LIKE 'log_bin';
      
  4. 配置源服务器设置。

    数据传入复制要求参数 lower_case_table_names 在源服务器与副本服务器之间保持一致。 在 Azure Database for MySQL 灵活服务器中,该参数默认为 1。

    SET GLOBAL lower_case_table_names = 1;
    
  5. 创建新的复制角色并设置权限。

    在源服务器上创建一个配置有复制特权的用户帐户。 可通过 SQL 命令或 MySQL Workbench 等工具实现此目的。 考虑是否打算使用 SSL 进行复制,因为这需要在创建用户时指定。 请参阅 MySQL 文档,了解如何在源服务器上添加用户帐户

    在以下命令中,创建的新复制角色可从任何计算机访问源服务器,而不仅仅可从托管源服务器本身的计算机进行访问。 这可以通过在创建用户的命令中指定“syncuser@'%'”来完成。 请参阅 MySQL 文档,详细了解如何指定帐户名称

    使用 SSL 复制

    如果所有用户连接都要求 SSL,请使用以下命令来创建用户:

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

    不使用 SSL 复制

    如果并非所有连接都要求 SSL,请使用以下命令来创建用户:

    CREATE USER 'syncuser'@'%' IDENTIFIED BY 'yourpassword';
    GRANT REPLICATION SLAVE ON *.* TO ' syncuser'@'%';
    
  6. 将源服务器设置为只读模式。

    在开始转储数据库之前,需将服务器置于只读模式。 在只读模式下,源服务器将无法处理任何写入事务。 评估对业务的影响,根据需要在非高峰时间计划只读窗口。

    FLUSH TABLES WITH READ LOCK;
    SET GLOBAL read_only = ON;
    
  7. 获取二进制日志文件名和偏移量。

    运行 show master status 命令,确定当前的二进制日志文件名和偏移量。

    show master status;
    

    结果应如下所示。 请务必记下二进制文件名,以供在后续步骤中使用。

    主机状态结果


转储并还原源服务器

  1. 确定要将哪些数据库和表复制到 Azure Database for MySQL 灵活服务器并从源服务器执行转储。

    可以使用 mysqldump 从主服务器转储数据库。 有关详细信息,请参阅转储和还原。 不需转储 MySQL 库和测试库。

  2. 将源服务器设置为读/写模式。

    转储数据库后,将 MySQL 源服务器改回读/写模式。

    SET GLOBAL read_only = OFF;
    UNLOCK TABLES;
    

    注意

    在服务器重新设置为读/写模式之前,可以使用全局变量 GTID_EXECUTED 检索 GTID 信息。 在后面的阶段将使用此信息在副本服务器上设置 GTID。

  3. 将转储文件还原到新服务器。

    将转储文件还原到在 Azure Database for MySQL 灵活服务器中创建的服务器。 请参阅转储和还原,了解如何将转储文件还原到 MySQL 服务器。 如果转储文件较大,请将它上传到副本服务器所在区域的 Azure 中的虚拟机。 将它从虚拟机还原到 Azure Database for MySQL 灵活服务器实例。

注意

如果你想要避免在转储和还原时将数据库设置为只读,可以使用 mydumper/myloader

在副本服务器中设置 GTID

  1. 如果使用基于 bin-log 位置的复制,请跳过此步骤

  2. 需要从源获取的转储文件中的 GTID 信息才能重置目标(副本)服务器的 GTID 历史记录。

  3. 使用来自源的此 GTID 信息,通过以下 CLI 命令在副本服务器上执行 GTID 重置:

    az mysql flexible-server gtid reset --resource-group  <resource group> --server-name <replica server name> --gtid-set <gtid set from the source server> --subscription <subscription id>
    

有关更多详细信息,请参阅 GTID 重置

注意

无法在启用了异地冗余备份的服务器上执行 GTID 重置。 要在服务器上执行 GTID 重置,请禁用异地冗余。 可以在 GTID 重置后再次启用异地冗余选项。 GTID 重置操作会使所有可用的备份失效,因此一旦再次启用异地冗余,就可能需要一天时间才能在服务器上执行异地还原

  1. 设置源服务器。

    所有数据传入复制函数均由存储过程执行。 可以在数据传入复制存储过程中找到所有过程。 这些存储过程可以在 MySQL shell 或 MySQL Workbench 中运行。

    要链接两个服务器并启动复制,请在 Azure Database for MySQL 服务中登录到目标副本服务器,并将外部实例设置为源服务器。 为此,可在 Azure Database for MySQL 服务器上使用 mysql.az_replication_change_mastermysql.az_replication_change_master_with_gtid 存储过程。

    CALL mysql.az_replication_change_master('<master_host>', '<master_user>', '<master_password>', <master_port>, '<master_log_file>', <master_log_pos>, '<master_ssl_ca>');
    
    CALL mysql.az_replication_change_master_with_gtid('<master_host>', '<master_user>', '<master_password>', <master_port>,'<master_ssl_ca>');
    
    • master_host:源服务器的主机名
    • master_user:源服务器的用户名
    • master_password:源服务器的密码
    • master_port:源服务器侦听连接的端口号。 (3306 是 MySQL 侦听的默认端口)
    • master_log_file:正在运行的 show master status 中的二进制日志文件名
    • master_log_pos:正在运行的 show master status 中的二进制日志位置
    • master_ssl_ca:CA 证书的上下文。 如果不使用 SSL,请传入空字符串。

    建议以变量形式传入此参数。 有关更多信息,请访问以下示例。

    注意

    • 如果源服务器托管在 Azure VM 中,请将“允许访问 Azure 服务”设置为“启用”,以允许源服务器和副本服务器相互通信。 从“连接安全性”选项可更改此设置。 有关详细信息,请参阅使用门户管理防火墙规则
    • 如果已使用 mydumper/myloader 转储了数据库,则可以从 /backup/metadata 文件获取 master_log_file 和 master_log_pos。

    示例

    使用 SSL 复制

    运行以下 MySQL 命令创建变量 @cert

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

    在域“companya.com”中托管的源服务器与 Azure Database for MySQL 灵活服务器中托管的副本服务器之间设置了使用 SSL 进行复制的功能。 将在副本上运行此存储过程。

    CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, @cert);
    
    CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, @cert);
    

    不使用 SSL 复制

    在域“companya.com”中托管的源服务器与 Azure Database for MySQL 灵活服务器中托管的副本服务器之间设置了不使用 SSL 进行复制的功能。 将在副本上运行此存储过程。

    CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mysql-bin.000002', 120, '');
    
    CALL mysql.az_replication_change_master_with_gtid('master.companya.com', 'syncuser', 'P@ssword!', 3306, '');
    
  2. 启动复制。

    调用 mysql.az_replication_start 存储过程以启动复制。

    CALL mysql.az_replication_start;
    
  3. 检查复制状态。

    在副本服务器上调用 show slave status 命令查看复制状态。

    show slave status;
    

    若要了解复制的正确状态,请查看监视页面下的复制指标 -“副本 IO 状态”和“副本 SQL 状态”。

    如果 Seconds_Behind_Master 为 "0",则复制在正常工作。 Seconds_Behind_Master 指示副本的陈旧状态。 如果其值不为“0”,则表示副本正在处理更新。

用于数据传入复制操作的其他有用的存储过程

停止复制

若要停止源服务器与副本服务器之间的复制,请使用以下存储过程:

CALL mysql.az_replication_stop;

删除复制关系

若要删除源服务器与副本服务器之间的关系,请使用以下存储过程:

CALL mysql.az_replication_remove_master;

跳过复制错误

若要跳过复制错误并允许复制继续,请使用以下存储过程:

CALL mysql.az_replication_skip_counter;
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos][LIMIT [offset,] row_count]

显示二进制日志结果

后续步骤