MySQL clone plugin怎样复制实例用于测试环境
来源:17golang原创
时间:2026-11-04 08:45:04 260浏览 收藏
如果测试环境需要一份接近 donor 实例的数据副本,MySQL Clone Plugin 比逐表导出再导入更直接:在 recipient 上执行 CLONE INSTANCE,数据从远程 donor 传过来。它适合初始化隔离的测试实例,但不是“把生产环境所有配置原样复制”的按钮。
官方地址:https://dev.mysql.com/doc/refman/8.4/en/
下面以 MySQL 8.4 的远程克隆为例。核心判断只有一个:recipient 是否是可以被覆盖或接收新数据的独立实例。默认方式会清理 recipient 的用户数据和二进制日志;如果还要保留当前数据,就使用独立的 DATA DIRECTORY。
先把 donor 和 recipient 分清
donor 是数据来源,recipient 是发起 CLONE INSTANCE 的接收端。远程克隆要求两端的 Clone Plugin 都处于 active 状态,并且 donor 与 recipient 使用同一 MySQL Server 系列、同一操作系统和平台。recipient 还要有足够磁盘空间,且两端的 max_allowed_packet 至少为 2MB。

先在两端分别确认版本和插件状态。示例中的主机名、账号和密码都是占位值,测试时请换成专用账号,不要把生产账号直接写进脚本。
-- 两端都检查版本;必须先确认属于同一 MySQL Server 系列 SHOW VARIABLES LIKE 'version'; -- 两端都确认 clone 插件已经加载 SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
在 donor 和 recipient 安装插件并准备权限
如果查询不到插件,再由管理账号在两端安装。donor 侧的克隆账号需要 BACKUP_ADMIN,用于读取并传输数据;recipient 侧的克隆账号需要 CLONE_ADMIN,用于替换接收端数据、阻止相应 DDL 并完成自动重启。
-- 仅在插件尚未安装时执行;两端都需要安装 INSTALL PLUGIN clone SONAME 'mysql_clone.so'; -- donor:创建只用于克隆的账号,并授予读取/传输所需权限 CREATE USER 'clone_donor'@'%' IDENTIFIED BY '替换为强密码'; GRANT BACKUP_ADMIN ON *.* TO 'clone_donor'@'%'; -- recipient:创建接收端账号;CLONE_ADMIN 包含克隆所需的管理能力 CREATE USER 'clone_recipient'@'localhost' IDENTIFIED BY '替换为强密码'; GRANT CLONE_ADMIN ON *.* TO 'clone_recipient'@'localhost';
生产环境不要为了省事使用 '%',应按实际网络来源收窄主机范围。测试环境也应在克隆完成后回收临时账号或至少轮换密码。
让 recipient 允许连接 donor
在 recipient 上设置 clone_valid_donor_list,把 donor 的主机和端口加入允许列表。端口应是经典 MySQL 协议端口;X Protocol 的 mysqlx_port 不用于这条远程克隆语句,MySQL Router 也不能作为 donor 连接入口。
-- 在 recipient 执行;地址应替换为 donor 的真实主机和端口 SET GLOBAL clone_valid_donor_list = 'donor.example.test:3306'; -- 复查 recipient 当前允许的 donor 列表 SHOW VARIABLES LIKE 'clone_valid_donor_list'; -- 检查传输包下限;两端都应至少为 2MB SHOW VARIABLES LIKE 'max_allowed_packet';
如果 recipient 不能解析 donor 主机名,可以按官方语法使用 IPv4 地址。IPv6 地址不能直接作为这条语句的 host 值,需要使用对应的别名。
默认目录会覆盖测试实例时,谨慎执行 CLONE INSTANCE
登录 recipient 的克隆账号后执行语句。省略 DATA DIRECTORY 时,MySQL 会删除 recipient 数据目录中的用户创建数据和二进制日志,再把 donor 数据复制过来,完成后默认自动重启 recipient。因此这个模式只适合“recipient 可以重置”的独立测试实例。
-- 在 recipient 上执行;该模式会替换 recipient 的用户数据 CLONE INSTANCE FROM 'clone_donor'@'donor.example.test':3306 IDENTIFIED BY '替换为 donor 克隆账号密码' REQUIRE SSL;
REQUIRE SSL 会明确要求传输使用加密连接。如果环境暂时没有满足条件的 TLS 配置,语句会报错;不要把这个报错改成忽略安全要求。省略 SSL 子句时,Clone Plugin 会优先尝试加密连接,再按规则回退。
需要保留 recipient 数据时使用 DATA DIRECTORY
如果测试实例当前还有要保留的用户数据,不要直接在默认数据目录上覆盖。给 recipient 指定一个不存在的绝对路径,Clone Plugin 会把克隆数据写到新目录;这个目录必须由 MySQL 创建,且运行账号要有写权限。
-- 新目录必须是不存在的绝对路径;先确认目录规划和磁盘空间 CLONE INSTANCE FROM 'clone_donor'@'donor.example.test':3306 IDENTIFIED BY '替换为 donor 克隆账号密码' DATA DIRECTORY = '/srv/mysql-test-clone' REQUIRE SSL;

写入命名目录时不会自动重启 recipient。需要使用这个目录启动另一个测试实例,并由运维脚本负责端口、socket、日志和权限隔离。不要在同一端口上直接启动两个 mysqld。
用 clone_status 处理重启和失败边界
默认数据目录模式会自动重启 recipient,但前提是 recipient 有能够监控 mysqld 停止和启动的 supervisor。若没有 supervisor,克隆数据可能已经传完,却在自动重启阶段返回“restart server failed”;这不等同于数据传输失败,应先手动启动实例,再查看 Clone Plugin 的 Performance Schema 表。
-- recipient 重启后再连接,查看最近一次克隆状态 SELECT STATE, BEGIN_TIME, END_TIME, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status; -- 查看阶段明细,定位传输或重启阶段的问题 SELECT * FROM performance_schema.clone_progress ORDER BY BEGIN_TIME DESC;
远程克隆同一时间只允许一个克隆操作。网络中断时,donor 会在 clone_donor_timeout_after_network_failure 允许的时间内等待恢复;超过窗口后操作会中止。遇到失败要先判断失败发生在前置检查、数据清理、传输还是重启阶段,再决定修复后重试或从原有备份恢复。
复制完成后别把它当成完整环境快照
Clone Plugin 主要复制数据,不复制 MySQL Server 配置;recipient 会保留自己的配置和持久化系统变量。它也不复制二进制日志,只有 InnoDB 中的数据按该机制复制,MyISAM 和 CSV 表可能以空表形式出现在 recipient。测试环境因此还需要单独准备参数文件、账号策略、端口、依赖服务和脱敏方案。
| 检查项 | 适合的判断 |
|---|---|
| 版本与平台 | 同一 Server 系列、同一操作系统和平台 |
| 数据目录 | 可重置就用默认目录;要保留现有数据就用不存在的 DATA DIRECTORY |
| 权限 | donor 为 BACKUP_ADMIN,recipient 为 CLONE_ADMIN |
| 重启方式 | 默认目录通常自动重启;命名目录需要人工或 supervisor 启动 |
| 复制范围 | 不把配置、二进制日志和非 InnoDB 数据当作完整快照 |
常见问题
为什么 8.0 和 8.4 不能直接克隆?
MySQL 8.4 文档把远程克隆限制在同一 Server 系列内;跨系列克隆不是这条命令的常规用法。测试环境应先统一版本系列,再处理补丁版本和平台条件。
DATA DIRECTORY 路径可以提前创建吗?
不建议。官方语法要求指定的是不存在的绝对路径,MySQL 需要有权限创建它。提前创建或路径不可写都会让前置检查失败。
克隆完成后配置文件为什么没有变?
这是预期行为:Clone Plugin 不负责复制 MySQL Server 配置。把数据复制完成后,还要按测试实例的端口、内存和连接需求单独配置。
把 MySQL Clone Plugin 用于测试环境时,最重要的不是记住一条 SQL,而是先选对 recipient 的数据目录模式:可以清空就明确接受默认目录的覆盖和重启;不能清空就使用独立的 DATA DIRECTORY,并为新实例准备完整的启动隔离条件。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
291 收藏
-
368 收藏
-
148 收藏
-
102 收藏
-
137 收藏
-
488 收藏
-
428 收藏
-
152 收藏
-
498 收藏
-
309 收藏
-
493 收藏
-
325 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习