登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  数据库 >  MySQL

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 Clone Plugin donor 到 recipient 的数据传输关系和权限边界说明图
图1:MySQL Clone Plugin 的 donor、网络传输与 recipient 静态关系说明图,不是运行截图。

先在两端分别确认版本和插件状态。示例中的主机名、账号和密码都是占位值,测试时请换成专用账号,不要把生产账号直接写进脚本。

-- 两端都检查版本;必须先确认属于同一 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;
MySQL Clone Plugin 默认目录和 DATA DIRECTORY 的覆盖与重启边界说明图
图2:默认数据目录与 DATA DIRECTORY 的数据覆盖、重启和保留边界说明图,不是执行结果。

写入命名目录时不会自动重启 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,并为新实例准备完整的启动隔离条件。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>