CLONE插件需严格配置:必须在my.cnf中添加plugin-load-add=mysql_clone.so和clone=force_plus_permanent,重启mysqld生效;本地克隆须确保目录权限、空间充足及buffer_size适配;远程克隆需双向权限、网络连通与valid_donor_list设置,且会清空目标datadir。

CLONE 插件不是“一键克隆”工具,它是一套需严格配置的物理快照机制——用错权限、配错参数或跳过验证步骤,轻则克隆失败,重则清空目标实例数据。
INSTALL PLUGIN 后必须加 clone=force_plus_permanent 配置
动态执行 INSTALL PLUGIN clone SONAME 'mysql_clone.so' 只能临时启用插件,MySQL 重启后会失效。很多用户以为装完就一劳永逸,结果第二天服务重启,CLONE 命令直接报错 ERROR 1701 (HY000): Cannot execute statement: binlog is disabled(实际是插件未加载,但错误提示有误导性)。
必须在 my.cnf 的 [mysqld] 段落中添加:
[mysqld] plugin-load-add=mysql_clone.so clone=force_plus_permanent
注意两点:
-
plugin-load-add是加载路径,不是插件名;不同系统下文件名可能为mysql_clone.dll(Windows)或mysql_clone.so(Linux),需确认实际文件名 -
clone=force_plus_permanent不是系统变量,而是插件注册指令:它让插件自动注册进mysql.plugins表,并禁止后续用UNINSTALL PLUGIN卸载 - 修改配置后必须执行
systemctl restart mysqld,仅 reload 不生效
本地克隆失败,90% 是因为目录权限或 clone_buffer_size 设置不当
执行 CLONE LOCAL DATA DIRECTORY = '/data/backup/mysql_clone' 时,常见报错 OS errno 13 - Permission denied,本质是 MySQL 进程(通常是 mysql 用户)无权写入目标路径。
正确做法:
- 用
mkdir -p /data/backup/mysql_clone创建完整路径 - 运行
chown -R mysql:mysql /data/backup/mysql_clone,不能只改父目录 - 确保磁盘剩余空间 ≥ 当前
datadir实际占用空间(du -sh /var/lib/mysql),CLONE不做压缩 - 若克隆大库(>50GB)且速度慢,可调大
clone_buffer_size(默认 4M):在my.cnf中加clone_buffer_size=32M,仅对本地克隆有效
远程克隆前必须双向验证 donor/recipient 权限与网络连通性
远程克隆命令形如 CLONE INSTANCE FROM 'u_clone'@'192.168.184.10':3306 IDENTIFIED BY 'StrongP@ss123',但它隐含两个独立动作:recipient 主动连接 donor 获取数据 + recipient 自身停服重建数据目录。任一环节失败都会中断。
务必检查:
- donor 实例上,用户
u_clone必须有BACKUP_ADMIN权限(仅此一项) - recipient 实例上,同名用户必须有
CLONE_ADMIN权限(该权限隐含SHUTDOWN,不可省略) - recipient 的
clone_valid_donor_list系统变量必须显式设置为 donor 地址,例如:SET GLOBAL clone_valid_donor_list = '192.168.184.10:3306'; - 防火墙要放行 donor 的 3306 端口(recipient 发起连接),且 donor 的
bind_address不能为127.0.0.1 - recipient 克隆前会自动执行
SHUTDOWN,因此不能是生产主库——它真会关库
克隆后无法启动?重点查 innodb_data_home_dir 和 redo 日志路径
克隆生成的是完整物理数据目录,但 recipient 原 my.cnf 中的 innodb_data_home_dir、innodb_log_group_home_dir 或 datadir 若与克隆目录不一致,MySQL 启动时会因找不到 ibdata1 或 redo 文件而卡死,日志里反复出现 InnoDB: Unable to lock ./ibdata1 error。
安全做法是:
- 克隆前,recipient 的
my.cnf中datadir应指向一个空目录(如/var/lib/mysql_new) - 克隆命令明确指定目标路径:
CLONE INSTANCE FROM ... DATA DIRECTORY = '/var/lib/mysql_new' - 克隆完成后,停止 MySQL,将原
datadir备份重命名,再把/var/lib/mysql_new改名为原路径,最后更新my.cnf中的datadir值并启动 - 切勿直接克隆到正在使用的
datadir目录——CLONE不支持增量,它会覆盖整个目录结构
远程克隆最危险的地方在于:它默认会清空 recipient 当前 datadir 下所有用户表空间和 binary log,这个动作不可逆。哪怕只差一条 SET GLOBAL clone_valid_donor_list 没执行,克隆也会静默失败,但目录已被清空。操作前务必确认备份路径、权限语句、网络策略三者全部就位。


















