直接用clone instance拉取物理快照可在5–10分钟内建起压测环境,但需严格满足: donor与recipient的mysql小版本(如8.0.29)、os架构、innodb_page_size、字符集、排序规则完全一致;recipient需配置clone_valid_donor_list、启用clone_admin权限用户、datadir为空且支持硬链接;克隆后须重置server_id并关闭log_bin以防压测干扰。

直接用 CLONE INSTANCE 拉一个和生产库完全一致的物理快照,5–10 分钟内就能跑起压测环境——但前提是 donor 和 recipient 的配置、权限、存储路径全部对齐,否则克隆会卡住、静默失败,或者压测时突然报错。
确认 donor 和 recipient 的 MySQL 版本与平台严格一致
MySQL 8.0.37 之前,CLONE INSTANCE 要求 donor 和 recipient 的小版本号(如 8.0.29 和 8.0.30)必须完全相同;8.0.37+ 才支持跨小版本克隆。更关键的是:操作系统架构(x86_64/Linux)、innodb_page_size、innodb_data_file_path、字符集(character_set_server)、排序规则(collation_server)必须一模一样。
- 查 donor 小版本:
SELECT VERSION(); - 查平台一致性:
SELECT @@innodb_page_size, @@character_set_server, @@collation_server;,recipient 上必须完全匹配 - 若 donor 使用了独立表空间(
CREATE TABLE ... TABLESPACE ts_name),recipient 上对应路径(如/data/mysql/ts_name.ibd)必须存在且可写,否则克隆中途报ERROR 1086 (HY000)
recipient 必须提前配好 clone_valid_donor_list 并开放网络访问
recipient 实例不主动连 donor,而是通过白名单机制校验 donor 地址——这步漏掉,CLONE INSTANCE 直接报 ER_CLONE_DONOR_NOT_FOUND,不是连接超时,也不是权限错误,容易误判。
- 在 recipient 上执行:
SET GLOBAL clone_valid_donor_list = '192.168.10.50:3306';(填 donor 的真实内网 IP + 端口) - donor 的
bind_address不能是127.0.0.1,得设为0.0.0.0或具体内网 IP,并确保防火墙放行 3306 - recipient 若启用了
require_secure_transport=ON,donor 用户也得带REQUIRE SSL,否则克隆阶段认证失败
用 CLONE_ADMIN 用户执行克隆,别混用复制账号
压测环境不需要复用线上复制链路,但权限体系不能乱:recipient 必须用拥有 CLONE_ADMIN 权限的用户执行 CLONE INSTANCE;donor 上对应用户只需 BACKUP_ADMIN(REPLICATION SLAVE 不需要)。用 root 或 repl 账号直接克隆,大概率触发 ERROR 3095 (HY000): Insufficient privileges。
- recipient 上建用户:
CREATE USER 'cloner'@'%' IDENTIFIED BY 'P@ssw0rd!'; GRANT CLONE_ADMIN ON *.* TO 'cloner'@'%'; - donor 上建同名同密用户:
CREATE USER 'cloner'@'%' IDENTIFIED BY 'P@ssw0rd!'; GRANT BACKUP_ADMIN ON *.* TO 'cloner'@'%'; - 克隆命令必须由 recipient 用户发起:
CLONE INSTANCE FROM 'cloner'@'192.168.10.50':3306 IDENTIFIED BY 'P@ssw0rd!';
克隆后立刻重置 server_id 和关闭 log_bin(压测专用)
克隆完 recipient 自动重启,数据目录被覆盖,但 auto.cnf 中的 server-uuid 保留——这对主从是刚需,但对压测环境反而是隐患:如果误开 binlog,大量压测写入会生成巨量日志,占满磁盘;server_id 若和 donor 冲突,后续连 donor 查状态也会异常。
- 重启后立刻登录 recipient,执行:
SELECT @@server_id, @@log_bin; - 若
server_id和 donor 相同,改掉:SET PERSIST server_id = 9999;(避免重启失效) - 压测库通常不需 binlog,关掉:
SET PERSIST log_bin = OFF;(注意:需提前停掉所有复制线程) - 别忘了删掉
gtid_executed相关残留(如gtid_purged),防止后续误启复制
最常被跳过的动作是检查 innodb_file_per_table 是否为 ON(recipient 必须开启,否则克隆报 Invalid tablespace file),以及忽略 clone_buffer_size 和 clone_enable_compression 对压测机网络吞吐的影响——千兆网卡上不开压缩,克隆 200GB 数据可能比开压缩慢 3 倍。











