MySQL 8 clone 插件快速重建主从集群

MySQL 8 Clone 插件快速重建主从集群

MySQL 数据库在运行过程中可能会遇到主从不同步的问题,这会严重影响数据的一致性和系统的稳定性。本文将介绍如何使用 MySQL 8 的 clone 插件来高效地重建主从数据库集群。

引言

当出现主从不同步错误时,通常需要仔细分析并定位问题原因。例如,在以下示例中,从库的同步报错显示了具体的事务执行失败详情:

mysql> show slave status \G;
-- 错误内容
Last_Errno: 1032
Last_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction 'ANONYMOUS' at master log mysql-bin.003633, end_log_pos 603058578.
-- 根据提示信息查询详细报错
mysql> SELECT * FROM performance_schema.replication_applier_status_by_worker WHERE LAST_ERROR_NUMBER = 1032 \G;

错误信息显示了具体的表名和事务执行失败的原因。由于主库的二进制日志已经丢失,因此需要通过重建从库来恢复数据一致性。

主从集群重建步骤

安装 clone 插件

为了使用 MySQL 8 的克隆功能,首先在主从两端安装相应的插件。

mysql> install plugin clone soname 'mysql_clone.so';

确认插件是否已成功安装:

mysql> select plugin_name, plugin_status from information_schema.plugins where plugin_name = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+

配置权限

执行克隆操作的用户需要特定的权限。根据是否是本地或远程操作,所需的权限有所不同:

  • 本地克隆:用户需 BACKUP_ADMIN 权限。
  • 远程克隆:捐赠端(源)用户需 BACKUP_ADMIN, 接受端(目标)用户需 CLONE_ADMIN。

主服务器配置:

mysql> GRANT BACKUP_ADMIN ON *.* TO 'root'@'%';
mysql> FLUSH PRIVILEGES;

从服务器配置:

mysql> GRANT CLONE_ADMIN ON *.* TO 'root'@'%';
mysql> FLUSH PRIVILEGES;

执行远程克隆操作

从库设置目标主节点地址,并开始执行克隆操作。

-- 设置有效的捐赠源地址
mysql> set global clone_valid_donor_list='192.168.31.188:3306';

-- 开始克隆实例
mysql> clone instance from root@'192.168.31.188':3306 identified by 'P@ssw0rd';

在执行过程中,可以通过以下查询来跟踪克隆进度:

mysql> SELECT 
    stage, state,
    CAST(begin_time AS DATETIME) as "START TIME",
    CAST(end_time AS DATETIME) as "FINISH TIME",
    LPAD(sys.format_time(POWER(10, 12) * (UNIX_TIMESTAMP(end_time) - UNIX_TIMESTAMP(begin_time))), 10, ' ') as DURATION,
    LPAD(CONCAT(FORMAT(ROUND(estimate / 1024 / 1024, 0), 0), "MB"), 16, ' ') as "Estimate",
    CASE 
        WHEN begin_time IS NULL THEN LPAD('%0', 7, ' ')
        WHEN estimate > 0 THEN LPAD(CONCAT(ROUND(data * 100 / estimate, 0), "%"), 7, ' ')
        WHEN end_time IS NULL THEN LPAD('0%', 7, ' ')
        ELSE LPAD('100%', 7, ' ')
    END as "Done(%)"
FROM performance_schema.clone_progress;

克隆完成后,通过以下查询确认操作状态:

mysql> SELECT * FROM performance_schema.clone_status;

总结

使用 MySQL 8 的 clone 插件可以高效地重建主从集群,在主库二进制日志丢失的情况下尤为有用。本文详细介绍了安装插件、配置权限以及执行远程克隆操作的步骤,确保数据库的一致性和稳定性。

在实际应用中,建议定期备份和监控数据库状态,以便及时发现并解决问题,避免出现数据不一致的情况。

启动主从复制

完成克隆后,MySQL 会自动重启实例。接下来的步骤包括配置和启动从库以实现与主库的数据同步。

首先查看当前服务器的 server_id 参数确认唯一性:

mysql> show variables like '%server_id%';

输出内容可能如下:

+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| server_id      | 2     |
| server_id_bits | 32    |
+----------------+-------+

配置从库连接到主数据库,执行以下命令来更新 master_host、master_user 和其他必要的参数:

mysql> change master to master_host='192.168.0.1',
        master_port=3306,
        master_user='replicationuser',
        master_password='securepassword',
        master_log_file='binarylog.000004',
        master_log_pos=572;

完成后,启动主从复制:

mysql> start slave;
Query OK, 0 rows affected (0.01 sec)

确认是否已建立同步关系并检查其状态:

mysql> show slave status \G;

输出结果中需要重点关注 Slave_IO_Running 和 Slave_SQL_Running 字段,确保它们都为 "Yes"。这表明主从复制已经成功设置。

验证主从同步

最后一步是验证数据是否已被正确地复制到从库:

mysql> show slave status \G;

若输出显示如下信息,则说明主从复制状态正常:

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.1
                  Master_User: replicationuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: binarylog.000004
          Read_Master_Log_Pos: 572
               Relay_Log_File: relay-bin.000001
                Relay_Log_Pos: 289
        Relay_Master_Log_File: binarylog.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

可以发现,主从已经恢复正常同步,并且没有延迟或其他问题。

总结

克隆插件提供了一种快速、高效的方法来构建 MySQL 主从集群。相比传统的备份和恢复方法(如 mysqldump 或物理备份工具),这种方法更加省时且减少了人为错误的可能性。然而,在使用克隆功能之前,您必须确保符合所有先决条件,并充分理解其影响范围。

通过这种方式,用户可以更轻松地部署大规模数据库集群,同时保持性能和数据一致性。