使用 CLONE 插件从头重建副本
MySQL复制命令
-- Donor (healthy replica or source)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
CREATE USER 'clone_donor'@'%' IDENTIFIED BY 'Cl0ne#Donor';
GRANT BACKUP_ADMIN ON *.* TO 'clone_donor'@'%';
-- Recipient (replica to rebuild; its data is replaced)
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SET GLOBAL clone_valid_donor_list = 'db1:3306';
CLONE INSTANCE FROM 'clone_donor'@'db1':3306 IDENTIFIED BY 'Cl0ne#Donor';
-- After the restart: verify and start replication
SELECT STATE, ERROR_NO, BINLOG_FILE, BINLOG_POSITION, GTID_EXECUTED FROM performance_schema.clone_status;
SELECT STAGE, STATE, ROUND(DATA / 1024 / 1024) AS data_mb FROM performance_schema.clone_progress;
CHANGE REPLICATION SOURCE TO SOURCE_HOST = 'db1', SOURCE_PORT = 3306, SOURCE_USER = 'repl', SOURCE_PASSWORD = 'Repl#2024', SOURCE_AUTO_POSITION = 1, SOURCE_SSL = 1;
START REPLICA;作用
通过网络物理复制 donor 的 InnoDB 数据,重启 recipient 并带过 GTID 状态;无需单独的备份、传输和还原步骤即可生成一致的副本。
适用场景
用于重建损坏的副本、存在 errant GTID 的副本或落后太多以至于其 binlog 已被清除的副本,或添加新副本。
注意
recipient 上的所有数据(包括用户)都会被 donor 的副本替换;root 密码变为 donor 的密码。donor 和 recipient 需要相同的版本系列、平台和插件集(8.0.37 之前要求完全相同的小版本)。在 recipient 上运行命令的用户需要 CLONE_ADMIN。克隆完成后 mysqld 会自行重启;如果没有 systemd / mysqld_safe 之类的监管进程,会返回 3707 'Restart server failed (mysqld is not managed by supervisor process)'。这不是失败:克隆已完成,请手动启动服务器。donor 会承受较重的 IO / 网络负载;可用 clone_max_concurrency 和 clone_max_data_bandwidth 限制。GTID 关闭时,请将 clone_status 中的 BINLOG_FILE / BINLOG_POSITION 用作 SOURCE_LOG_FILE / SOURCE_LOG_POS。