克隆前须启用clone插件并授予BACKUP_ADMIN权限;跨机克隆用CLONE INSTANCE,本机备份用CLONE LOCAL DIRECTORY;克隆后必须删除auto.cnf以生成新server-uuid。

克隆前必须确认 clone 插件已启用且权限到位
MySQL 8.0.17+ 自带 clone 插件,但默认不激活。没启用就执行克隆,会直接报错 ERROR 1126 (HY000): Can't open shared library 'mysql_clone.so' 或更隐晦的 Unknown command 'CLONE'。
实操建议:
- 登录后先运行
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';,确认状态是ACTIVE - 若为
DISABLED,执行INSTALL PLUGIN clone SONAME 'mysql_clone.so';(注意路径依赖:Linux 下通常是mysql_clone.so,Windows 是mysql_clone.dll) - 操作用户必须有
BACKUP_ADMIN权限(仅REPLICATION SLAVE或PROCESS不够),否则克隆时提示ERROR 3095 (HY000): The cloning operation failed: Insufficient privileges - 目标实例(接收端)需关闭
innodb_file_per_table=OFF的旧模式,否则克隆会失败并报Invalid tablespace file
CLONE INSTANCE 和 CLONE LOCAL DIRECTORY 怎么选
在线克隆分两种路径:远程实例直连克隆(CLONE INSTANCE)和本地目录快照克隆(CLONE LOCAL DIRECTORY)。选错会导致连接拒绝、路径不可写或权限错误。
实操建议:
- 跨机器克隆用
CLONE INSTANCE:要求源实例开启clone_valid_donor_list,且目标实例能通过 MySQL 协议直连源(不是 ssh 或文件共享),命令形如CLONE INSTANCE FROM 'user'@'donor_host':3306 IDENTIFIED BY 'pwd'; - 本机备份恢复用
CLONE LOCAL DIRECTORY:适合做定期快照,例如CLONE LOCAL DIRECTORY = '/backup/clone_20240520';,但目标路径必须由mysqld进程可写,且不能位于datadir内部(否则报Directory overlaps with data directory) - 远程克隆时,源实例的
bind_address不能是127.0.0.1,否则目标连不上;推荐设为0.0.0.0并配好防火墙白名单
克隆过程卡住或失败的典型原因
克隆不是“一键完成”,它会锁表、拷贝 ibd、重建 redo log,期间遇到资源瓶颈或配置冲突就会中断,日志里往往只显示 ERROR 3880 (HY000): Clone Donor Error 这类泛化错误。
实操建议:
- 检查源实例磁盘空间是否充足——克隆期间源端需保留原数据,目标端需预留等量空闲空间(临时 + 最终 datadir),不足会静默失败
- 确认
innodb_log_file_size在两端一致,否则克隆后启动报InnoDB: Invalid log file size - 避免在克隆中修改源库结构(如 DDL),会触发
Clone donor was invalidated - 网络不稳定时,远程克隆可能卡在
State: Clone Donor Wait阶段超时(默认clone_donore_timeout是 3600 秒),可通过SET GLOBAL clone_donore_timeout = 7200;调整
克隆后的实例不能直接启动?别忘了清理元数据
克隆生成的是完整副本,但目标实例的 auto.cnf、server-uuid、binlog.index 等仍沿用源端值,直接启动会导致主从冲突、GTID 混乱或无法注册到集群。
实操建议:
- 克隆完成后,**必须删除目标
datadir下的auto.cnf**,让 mysqld 启动时自动生成新server-uuid - 如果启用了 binlog,手动清空
binlog.index并删掉旧 binlog 文件(否则启动时报Could not open log file) - 不要用
mysqld --initialize重初始化,那会清空克隆来的数据;也不要跳过--skip-grant-tables启动,克隆后的权限表是完整的,强行跳过反而破坏一致性 - 首次启动后立刻执行
SELECT @@server_uuid;和SHOW MASTER STATUS;,验证是否与源端不同
克隆看起来是复制数据,实际是重建一套独立实例,所有标识性文件和日志状态都得“断干净”。漏掉 auto.cnf 是最常被忽略的一步。










