MySQL8快速克隆插件使用指南
# 使用 MySQL 8.0 克隆插件快速搭建主从复制
MySQL 8.0 的 clone 插件提供了一种高效的方式来克隆数据实例,便于快速创建 MySQL 实例,并支持主从复制和组复制的搭建。本文将介绍如何使用 MySQL 8.0 clone 插件来快速搭建主从复制。
版本说明
本文写于 2022-09,基于 MySQL 8.0 Clone Plugin(8.0.17+ 引入)。
Clone 插件的核心用法未变,经 2026-07 复核仍适用。
# 环境准备
在开始之前,请确保您的环境符合以下要求:
- MySQL 版本:8.0.19 或更高(MySQL 8.0.17 版本后才引入 clone 插件)
- 主库 IP 地址:192.0.2.11
- 从库 IP 地址:192.0.2.12
本文将通过实例操作,演示如何从主库克隆数据到从库,并在克隆完成后搭建主从复制。
# 1. 安装 clone 插件
# 在主库执行
-- 安装克隆插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-- 验证插件安装
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='clone';
1
2
3
4
5
2
3
4
5
# 在从库执行
-- 安装克隆插件
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
-- 验证插件安装
SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME='clone';
1
2
3
4
5
2
3
4
5
# 2. 创建用户并授权
# 在主库执行
-- 创建复制账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'YourPassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
-- 创建克隆用户并授权
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'YourPassword';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';
GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'%';
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 在从库执行
-- 只需创建克隆用户并授权
CREATE USER 'clone_user'@'%' IDENTIFIED BY 'YourPassword';
GRANT BACKUP_ADMIN ON *.* TO 'clone_user'@'%';
GRANT CLONE_ADMIN ON *.* TO 'clone_user'@'%';
1
2
3
4
2
3
4
# 3. 执行克隆任务
# 在从库执行
-- 设置克隆源(主库地址)
SET GLOBAL clone_valid_donor_list = '192.0.2.11:3306';
-- 开始克隆(从主库克隆数据到从库)
CLONE INSTANCE FROM 'clone_user'@'192.0.2.11':3306 IDENTIFIED BY 'YourPassword';
1
2
3
4
5
2
3
4
5
⚠️ 这是不可逆操作:CLONE INSTANCE 会清空接收方的整个数据目录,然后用源库的数据覆盖。执行前务必确认连的是哪台机器——在生产主库上误敲一次这条命令,等于把主库数据抹掉换成别人的。执行后从库会自动重启。
克隆过程中可以随时中止:
-- 在另一个 session 里查出克隆线程的 PROCESSLIST_ID 后 KILL
SELECT PID FROM performance_schema.clone_status;
1
2
2
中止后数据目录处于不完整状态,必须重新克隆,不能直接启动使用。
# 4. 启动复制
# 在从库执行(重启后)
-- 查看克隆后的 Binlog 文件和位置
SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;
-- 查看 GTID 信息
SELECT @@GLOBAL.GTID_EXECUTED;
-- 配置并启动复制(新语法:START REPLICA 自 8.0.22、CHANGE REPLICATION SOURCE TO 自 8.0.23;旧的 CHANGE MASTER TO / START SLAVE 已弃用但仍兼容)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.0.2.11',
SOURCE_PORT = 3306,
SOURCE_USER = 'repl',
SOURCE_PASSWORD = '<password>',
SOURCE_AUTO_POSITION = 1;
-- 启动从库复制线程
START REPLICA;
-- 查看从库状态
SHOW REPLICA STATUS\G
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 5. 克隆过程中的状态监控
# 在从库执行
-- 监控克隆状态
SELECT STATE, ERROR_NO, ERROR_MESSAGE FROM performance_schema.clone_status;
-- 监控克隆进度
SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
1
2
3
4
5
2
3
4
5
# 6. 跨机房传输限速设置
# 在主库执行
-- 限制克隆过程的网络带宽(单位:MB/s)
SET GLOBAL clone_max_network_bandwidth = 20; -- 设置为 20MB/s,相当于 160Mbit/s
1
2
2
# 7. 使用限制
克隆功能的限制包括:
- 克隆期间不允许在主库执行 DDL 操作(如 truncate table)
- 克隆的 MySQL 实例版本必须一致
- 每次只能克隆一个实例
- 不支持克隆 MySQL 配置信息和 Binlog 日志
- 仅支持克隆 InnoDB 存储引擎的数据(MyISAM / CSV 等表会被跳过,克隆完成后这些表在新实例上是空的——历史库里如果还有 MyISAM 表,这一条足以让整个克隆结果不可用)
- 捐赠方与接收方的 MySQL 版本必须完全一致(含小版本),操作系统平台与位数必须一致
- 两端的
innodb_page_size、innodb_data_file_path等必须一致 - 接收方的
clone插件必须已安装,且磁盘剩余空间要大于源库数据总量
# 验证
1. 确认克隆本身成功:
SELECT STATE, ERROR_NO, ERROR_MESSAGE, BINLOG_FILE, BINLOG_POSITION, GTID_EXECUTED
FROM performance_schema.clone_status\G
1
2
2
预期输出:
STATE: Completed
ERROR_NO: 0
ERROR_MESSAGE:
BINLOG_FILE: mysql-bin.000012
BINLOG_POSITION: 1547
GTID_EXECUTED: a47892ad-e207-11e9-bd0d-5254003519fe:1-8842
1
2
3
4
5
6
2
3
4
5
6
STATE 必须是 Completed。停在 In Progress 或出现 Failed 时,ERROR_MESSAGE 会写明原因(最常见的是权限不足或磁盘不够)。
2. 确认复制已建立且追上:
SHOW REPLICA STATUS\G
1
关注这三行:
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
Seconds_Behind_Source: 0
1
2
3
2
3
3. 确认数据真的对得上(别只看复制状态就收工):
-- 两边分别执行,比对结果
SELECT table_schema, COUNT(*) AS tables, SUM(table_rows) AS approx_rows
FROM information_schema.TABLES
WHERE table_schema NOT IN ('sys','mysql','performance_schema','information_schema')
GROUP BY table_schema;
1
2
3
4
5
2
3
4
5
table_rows 对 InnoDB 是估算值,只能做量级核对。要严格校验用 pt-table-checksum。
# 坑与边界
- 克隆期间捐赠方(源库)不能执行 DDL,会直接失败或阻塞。给大库做克隆前先确认没有跑着的
gh-ost/ 定时 DDL 任务。 clone_valid_donor_list是接收方的设置,不是源库的。设错位置是最常见的报错原因(ERROR 3862: Clone Donor Error)。- 限速参数
clone_max_network_bandwidth设在捐赠方,单位 MiB/s,0表示不限速。跨机房克隆不限速会把专线打满,务必先设。 - 克隆完成不等于可以直接接业务:新实例继承了源库的
server_id和server_uuid——server_uuid会在首次启动时自动重新生成,但server_id来自配置文件,必须手工改成唯一值,否则复制拓扑里会出现两个相同server_id,表现为复制反复断连。 - 克隆得到的实例带着源库的全部账号和权限,包括源库的 root 密码。作为从库没问题,但如果是克隆去做测试环境,要记得清理生产账号。
- 不要用克隆做备份。它是「搭一个一模一样的实例」,不是时间点备份——没有增量、不能恢复到指定时刻。备份该用 xtrabackup 或 mysqldump(见 MySQLdump逻辑备份)。
上次更新: 9/8/2026