MySQL 8.0克隆插件可快速部署TB级从库,需启用插件、配置CLONE_ADMIN用户、设置clone_valid_donor_list,并确保存储与配置一致;克隆后保留server-uuid和server-id,需手动配置复制并校准GTID。

MySQL 8.0 的克隆插件(clone)能直接从主库或现有从库拉取完整数据快照,跳过传统复制初始化的 dump + load + binlog 回放流程,5–10 分钟内完成 TB 级从库部署——但前提是插件已启用、用户权限正确、网络与存储满足原子写要求。
确认克隆插件已安装并启用
克隆插件不是默认加载的,必须显式安装;且仅支持本地克隆(同一实例)和远程克隆(跨实例),后者才是扩容从库的关键路径。
- 登录 MySQL 执行
INSTALL PLUGIN clone SONAME 'mysql_clone.so';—— 若报错Plugin 'clone' is disabled,说明 mysqld 启动时禁用了该插件,需检查配置文件中是否含plugin-load-add=clone或clone=FORCE - 运行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';,状态必须为ACTIVE - 远程克隆依赖
clone系统变量开启:SET GLOBAL clone_valid_donor_list = '192.168.1.10:3306';(填 donor 实例地址),否则执行CLONE INSTANCE会报错ER_CLONE_DONOR_NOT_FOUND
创建具备 CLONE_ADMIN 权限的专用用户
克隆操作不走普通复制账户,必须用拥有 CLONE_ADMIN 全局权限的用户连接 donor(源)和 recipient(目标),且该用户需在双方实例上存在、密码一致(远程克隆校验凭据)。
- 在 donor 和 recipient 上均执行:
CREATE USER 'cloner'@'%' IDENTIFIED BY 'StrongPass123!'; - 授予权限:
GRANT CLONE_ADMIN ON *.* TO 'cloner'@'%'; - 注意:不能只给
REPLICATION SLAVE或BACKUP_ADMIN,克隆过程不复用复制权限体系 - 若使用 SSL 连接,需确保双方
require_secure_transport=ON时,该用户也启用了REQUIRE SSL
执行远程克隆并立即启动复制
克隆完成后,recipient 实例自动重启(这是设计行为),数据目录被完全覆盖,但 auto.cnf 中的 server-uuid 会被保留——这点至关重要,否则后续启动复制会因 UUID 冲突拒绝连接 master。
- 在 recipient 实例上执行:
CLONE INSTANCE FROM 'cloner'@'192.168.1.10':3306 IDENTIFIED BY 'StrongPass123!'; - 克隆期间 donor 实例仍可读写,但会短暂加全局读锁(毫秒级),不影响业务
- 克隆结束、recipient 自动重启后,立刻执行:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.10', SOURCE_USER='repl', SOURCE_PASSWORD='xxx', SOURCE_AUTO_POSITION=1;(注意用你的复制账号,不是 cloner) - 关键:不要手动修改
server-id!克隆会保留原 recipient 的server-id(来自my.cnf),只要它与 donor 不同即可;若相同,需在克隆前改好 recipient 配置并重启 mysqld(克隆不覆盖 my.cnf)
常见失败原因与绕过方式
克隆失败往往不报具体路径错误,而是卡在 “Cloning from …” 或直接退出,日志里只有 Clone Donor Error。实际多由底层存储或配置隐性冲突导致。
-
ER_CLONE_DISK_FULL:recipient 数据目录所在磁盘剩余空间需 ≥ donor 实际数据大小 × 1.2(克隆过程需要临时空间写入页校验块) - 使用 XFS 文件系统时,若未启用
inode64挂载选项,克隆大表可能因 inode 分配失败中断 - donor 开启了
innodb_file_per_table=OFF,而 recipient 是 ON(或反之):克隆会失败,报ER_CLONE_INCONSISTENT_TABLESPACE;两边必须一致 - 如果 donor 使用加密表空间(
innodb_encrypt_tables=ON),recipient 必须启用相同密钥环插件且配置一致,否则克隆后无法启动
真正麻烦的不是命令敲错,而是克隆后 SHOW SLAVE STATUS\G 显示 Retrieved_Gtid_Set 为空、Executed_Gtid_Set 却有值——这说明克隆虽成功,但 GTID 位置没对齐 donor 当前位点,需人工从 donor 的 SHOW MASTER STATUS 中提取 Executed_Gtid_Set,再在 recipient 上用 SET GLOBAL gtid_purged = '...'; 补齐,否则复制会跳过中间事务。


















