在 Azure Database for MariaDB 中配置数据传入复制

重要

Azure Database for MariaDB 已列入停用计划。 强烈建议迁移到 Azure Database for MySQL。 有关迁移到 Azure Database for MySQL 的详细信息,请参阅 Azure Database for MariaDB 发生了什么情况?

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

为了在 Azure Database for MariaDB 服务中创建副本,数据传入复制会同步本地 MariaDB 源服务器、虚拟机 (VM) 或云数据库服务中的数据。 数据传入复制功能依靠的是基于二进制日志 (binlog) 文件位置、从本机到 MariaDB 的复制。 要详细了解 binlog 复制,请参阅 binlog 复制概述

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

注意

如果源服务器的版本为 10.2 或更高版本,我们建议使用全局事务 ID 设置数据传入复制。

注意

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

创建用作副本的 MariaDB 服务器

  1. 创建新的 Azure Database for MariaDB 服务器(例如 replica.mariadb.database.chinacloudapi.cn)。 在数据传入复制中,该服务器为副本服务器。

    若要了解如何创建服务器,请参阅使用 Azure 门户创建 Azure Database for MariaDB 服务器

    重要

    必须在“常规用途”或“内存优化”定价层中创建 Azure Database for MariaDB 服务器。

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

    用户帐户不会从源服务器复制到副本服务器。 若要为用户提供副本服务器的访问权限,必须在新建的 Azure Database for MariaDB 服务器上创建所有帐户和对应的特权。

  3. 将源服务器的 IP 地址添加到副本的防火墙规则。

    使用 Azure 门户Azure CLI 更新防火墙规则。

配置源服务器

以下步骤准备并配置本地、VM 或云数据库服务中托管的 MariaDB 服务器,以实现数据传入复制。 该 MariaDB 服务器是数据传入复制中的源服务器。

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

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

    尝试从另一台计算机上托管的工具(如 MySQL 命令行)进行连接,以测试与源服务器的连接。

    如果你的组织有严格的安全策略,并且不允许源服务器上的所有 IP 地址都能进行从 Azure 到源服务器的通信,那么你可能可以使用以下命令来确定 Azure Database for MariaDB 服务器的 IP 地址。

    1. 使用 MySQL 命令行之类的工具登录 Azure Database for MariaDB。

    2. 执行下面的查询。

      SELECT @@global.redirect_server_host;
      

      下面是一些示例输出:

      +-----------------------------------------------------------+
      | @@global.redirect_server_host                             |
      +-----------------------------------------------------------+
      | e299ae56f000.tr1830.chinaeast2-a.worker.database.chinacloudapi.cn |
       +-----------------------------------------------------------+
      
    3. 退出 MySQL 命令行。

    4. 在 ping 实用工具中执行以下命令以获取 IP 地址。

      ping <output of step 2b>
      

      例如: 。

      C:\Users\testuser> ping e299ae56f000.tr1830.chinaeast2-a.worker.database.chinacloudapi.cn
      Pinging tr1830.chinaeast2-a.worker.database.chinacloudapi.cn (**11.11.111.111**) 56(84) bytes of data.
      
    5. 配置源服务器的防火墙规则,以便在端口 3306 上包括上一步的输出 IP 地址。

    注意

    此 IP 地址可能因维护/部署操作而发生更改。 这种连接方法仅适用于无法承受在 3306 端口上允许所有 IP 地址的客户。

  3. 启用二进制日志记录。

    若要查看是否已在主服务器上启用二进制日志记录,请输入以下命令:

    SHOW VARIABLES LIKE 'log_bin';
    

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

    如果 log_bin 返回了值 OFF,请编辑 my.cnf 文件,使 log_bin=ON 启用二进制日志记录。 重启服务器,使更改生效。

  4. 配置源服务器设置。

    “数据传入复制”要求参数 lower_case_table_names 在源服务器与副本服务器之间保持一致。 在 Azure Database for MariaDB 中,lower_case_table_names 参数默认设置为 1

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

    在源服务器上创建一个配置有复制特权的用户帐户。 可以使用 SQL 命令或 MySQL Workbench 创建帐户。 如果你打算使用 SSL 进行复制,则必须在创建用户帐户时指定此设置。

    若要了解如何在源服务器上添加用户帐户,请参阅 MariaDB 文档

    如果使用以下命令,则新的复制角色可从任何计算机访问源服务器,而不仅仅可从托管源服务器本身的计算机进行访问。 若要进行这种访问,可在用于创建用户的命令中指定 syncuser@'%'。

    若要详细了解如何指定帐户名称,请参阅 MariaDB 文档。

    SQL 命令

    • 使用 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'@'%';
      

    MySQL Workbench

    若要在 MySQL Workbench 中创建复制角色,请在“管理”窗格中选择“用户和特权”。 然后选择“添加帐户”。

    Users and Privileges

    在“登录名”字段中输入用户名。

    Sync user

    选择“管理角色”面板,然后在“全局特权”列表中选择“复制从属实例”。 选择“应用”以创建复制角色。

    Replication Slave

  6. 将源服务器设置为只读模式。

    在开始转储数据库之前,必须将服务器置于只读模式。 在只读模式下,源服务器无法处理任何写入事务。 为帮助避免对业务造成影响,请将只读时段安排在非高峰期。

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

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

    show master status;
    

    结果应类似于下表中的内容:

    Master Status Results

    请记下二进制文件名,因为后面的步骤中将要用到它。

  8. 获取 GTID 位置(可选,使用 GTID 复制时需要用到)。

    运行函数 BINLOG_GTID_POS 获取相应 binlog 文件名和偏移量的 GTID 位置。

    select BINLOG_GTID_POS('<binlog file name>', <binlog offset>);
    

转储并还原源服务器

  1. 从源服务器转储所有数据库。

    使用 mysqldump 从源服务器转储所有数据库。 不需要转储 MySQL 库和测试库。

    有关详细信息,请参阅转储和还原

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

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

    SET GLOBAL read_only = OFF;
    UNLOCK TABLES;
    
  3. 将转储文件还原到新服务器。

    将转储文件还原到 Azure Database for MariaDB 服务中创建的服务器。 请参阅转储和还原,了解如何将转储文件还原到 MariaDB 服务器。

    如果转储文件较大,请将它上传到副本服务器所在区域的 Azure 中的 VM。 将转储文件从 VM 还原到 Azure Database for MariaDB 服务器。

  1. 设置源服务器。

    所有数据传入复制功能都是通过存储过程完成的。 可以在数据传入复制存储过程中找到所有过程。 存储过程可以在 MySQL shell 或 MySQL Workbench 中运行。

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

    CALL mysql.az_replication_change_master('<master_host>', '<master_user>', '<master_password>', 3306, '<master_log_file>', <master_log_pos>, '<master_ssl_ca>');
    

    CALL mysql.az_replication_change_master_with_gtid('<master_host>', '<master_user>', '<master_password>', 3306, '<master_gtid_pos>', '<master_ssl_ca>');
    
    • master_host:源服务器的主机名
    • master_user:源服务器的用户名
    • master_password:源服务器的密码
    • master_log_file:正在运行的 show master status 中的二进制日志文件名
    • master_log_pos:正在运行的 show master status 中的二进制日志位置
    • master_gtid_pos:正在运行的 select BINLOG_GTID_POS('<binlog file name>', <binlog offset>); 中的 GTID 位置
    • master_ssl_ca:CA 证书的上下文。 如果未使用 SSL,请传入空字符串。*

    \* 建议在 master_ssl_ca 参数中以变量形式传入此字符串。 有关详细信息,请参阅以下示例。

    示例

    • 使用 SSL 进行复制

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

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

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

      CALL mysql.az_replication_change_master('master.companya.com', 'syncuser', 'P@ssword!', 3306, 'mariadb-bin.000016', 475, @cert);
      
    • 在不使用 SSL 的情况下进行复制

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

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

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

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

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

    show slave status;
    

    如果 Slave_IO_RunningSlave_SQL_Running 的状态为 yes,并且 Seconds_Behind_Master 的值为 0,则表示复制正常运行。 Seconds_Behind_Master 指示副本的陈旧状态。 如果值不是 0,则表示副本正在处理更新。

  4. 更新相应的服务器变量,使数据传入复制更安全(仅当不使用 GTID 进行复制时才需要这样做)。

    由于 MariaDB 中的本机复制限制,在不使用 GTID 方案进行复制时,必须设置 sync_master_infosync_relay_log_info 变量。

    检查副本服务器的 sync_master_infosync_relay_log_info 变量,确保数据传入复制稳定,并将这些变量设置为 1

其他存储过程

停止复制

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

CALL mysql.az_replication_stop;

删除复制关系

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

CALL mysql.az_replication_remove_master;

跳过复制错误

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

CALL mysql.az_replication_skip_counter;

后续步骤

详细了解 Azure Database for MariaDB 的数据传入复制