18、克隆插件
克隆插件
有了 Clone Plugin,只用一条命令,我们就能很方便地添加一个新的节点,无论是在 Group Replication 还是普通的主从环境中。
安装
Clone Plugin 可通过以下两种方式安装:
动态加载:
mysql> install plugin clone soname 'mysql_clone.so';
[mysql]plugin-load-add=mysql_clone.so
执行 show plugins 查看插件是否安装成功。
Status 为 ACTIVE 代表插件加载成功。
(文档中包含示例图片)
Clone Plugin 的使用
本地克隆
本地克隆是将本地 MySQL 实例中的数据拷贝到本地服务器的一个目录中。本地克隆只能在实例本地发起。
本地克隆命令的语法如下:
CLONE LOCAL DATA DIRECTORY [=] 'clone_dir';
clone_dir 是克隆目录。mysql> create user 'clone_user'@'%' identified by 'clone_pass';mysql> grant backup_admin on *.* to 'clone_user'@'%';
backup_admin 是克隆操作必需权限,它允许用户执行 LOCK INSTANCE FOR BACKUP 命令。# mkdir -p /data/backup# chown -R mysql.mysql /data/backup/
# mysql -uclone_user -pclone_passmysql> clone local data directory='/data/backup/3307';
# /usr/local/mysql/bin/mysql --no-defaults --datadir=/data/backup/3307 --user mysql --port 3307 &
这里的 /data/backup/3307 是克隆目录,它需满足以下几点要求:
-
克隆目录必须是绝对路径。
-
/data/backup必须存在,且 MySQL 对其有可写权限。 -
最后一级目录
3307不能存在。
远程克隆
远程克隆涉及两个实例。被克隆的实例是 Donor,接受克隆数据的实例是 Recipient。克隆命令需在 Recipient 上发起。

远程克隆命令的语法如下:
CLONE INSTANCE FROM 'user'@'host':portIDENTIFIED BY 'password'[DATA DIRECTORY [=] 'clone_dir'][REQUIRE [NO] SSL];
这里面:
-
host,port:被克隆实例 (Donor) 的 IP 和端口。 -
user,password:Donor 上的克隆用户和密码,需要backup_admin权限。 -
DATA DIRECTORY:备份目录。不指定的话,则默认克隆到 Recipient 的数据目录下。 -
REQUIRE [NO] SSL:是否开启 SSL 通信。
1. 在 Donor 实例上创建克隆用户,加载 Clone Plugin
mysql> create user 'donor_user'@'%' identified by 'donor_pass';mysql> grant backup_admin on *.* to 'donor_user'@'%';mysql> install plugin clone soname 'mysql_clone.so';
mysql> create user 'recipient_user'@'%' identified by 'recipient_pass';mysql> grant clone_admin on *.* to 'recipient_user'@'%';mysql> install plugin clone soname 'mysql_clone.so';
mysql> set global clone_valid_donor_list = '192.168.79.10:3306';
# mysql -urecipient_user -precipient_passmysql> clone instance from 'donor_user'@'192.168.79.10':3306 identified by 'donor_pass';
远程克隆会依次执行以下操作:
-
获取备份锁(Backup Lock)。备份锁和 DDL 互斥。注意,获取的不仅仅是 Recipient 上的备份锁,Donor 上的同样也要获取。
-
Drop 用户表空间。
-
从 Donor 实例拷贝数据。
-
重启实例。
查看克隆操作的进度
查看克隆操作的进度,主要依托于 performance_schema 中的两张表:clone_status 和 clone_progress。
mysql> select * from performance_schema.clone_status\G*************************** 1. row ***************************ID: 1PID: 0STATE: CompletedBEGIN_TIME: 2024-01-14 14:11:42.972END_TIME: 2024-01-14 14:11:48.104SOURCE: 192.168.79.10:3306DESTINATION: LOCAL INSTANCEERROR_NO: 0ERROR_MESSAGE:BINLOG_FILE: mysql-bin.000002BINLOG_POSITION: 2731GTID_EXECUTED:1 row in set (0.00 sec)
mysql> select * from performance_schema.clone_progress;+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+| ID | STAGE | STATE | BEGIN_TIME | END_TIME | THREADS | ESTIMATE | DATA | NETWORK | DATA_SPEED | NETWORK_SPEED |+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+| 1 | DROP DATA | Completed | 2024-01-14 14:11:43.069825 | 2024-01-14 14:11:43.193118 | 1 | 0 | 0 | 0 | 0 | 0 || 1 | FILE COPY | Completed | 2024-01-14 14:11:43.193175 | 2024-01-14 14:11:44.288469 | 1 | 72586857 | 72586857 | 0 | 72599404 | 0 || 1 | PAGE COPY | Completed | 2024-01-14 14:11:44.288645 | 2024-01-14 14:11:44.290764 | 1 | 0 | 99 | 0 | 0 | 0 || 1 | REDO COPY | Completed | 2024-01-14 14:11:44.290871 | 2024-01-14 14:11:44.292016 | 1 | 2560 | 2560 | 0 | 2901 | 0 || 1 | FILE SYNC | Completed | 2024-01-14 14:11:44.292066 | 2024-01-14 14:11:44.315454 | 1 | 0 | 0 | 0 | 0 | 0 || 1 | RESTART | Completed | 2024-01-14 14:11:44.315454 | 2024-01-14 14:11:47.822686 | 0 | 0 | 0 | 0 | 0 | 0 || 1 | RECOVERY | Completed | 2024-01-14 14:11:47.822686 | 2024-01-14 14:11:48.103821 | 0 | 0 | 0 | 0 | 0 | 0 |+----+-------------+-----------+----------------------------+----------------------------+---------+-----------+-----------+---------+-----------------+----------------+7 rows in set (0.00 sec)
基于克隆数据搭建从库
这里,区分两种场景:GTID 复制和基于位置点的复制。
GTID 复制
对于 GTID 复制,无需关心具体的位置点信息,直接设置 MASTER_AUTO_POSITION = 1 即可。具体命令如下:
mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name',MASTER_PORT = master_port_num,MASTER_AUTO_POSITION = 1;mysql> START SLAVE;
基于位置点的复制
mysql> SELECT BINLOG_FILE, BINLOG_POSITION FROM performance_schema.clone_status;mysql> CHANGE MASTER TO MASTER_HOST = 'master_host_name',MASTER_PORT = master_port_num,MASTER_LOG_FILE = 'master_log_name',MASTER_LOG_POS = master_log_pos;mysql> START SLAVE;
master_log_name、master_log_pos 分别取自 performance_schema.clone_status 中的 BINLOG_FILE 和 BINLOG_POSITION。
使用限制
在使用 Clone Plugin 时,注意以下限制:
-
克隆期间,会阻塞 DDL。同样,DDL 也会阻塞克隆命令的执行。不过从 MySQL 8.0.27 开始,克隆命令不会阻塞 Donor 上的 DDL。
-
Clone Plugin 不会拷贝 Donor 的配置参数、Binlog。
-
Clone Plugin 只会拷贝 InnoDB 表的数据,对于其它存储引擎的表,只会拷贝表结构。
-
Donor 实例中如果有表通过
DATA DIRECTORY子句设置了绝对路径,在进行本地克隆时,会提示文件已存在。在进行远程克隆时,绝对路径必须存在且有可写权限。 -
不允许通过 MySQL Router 连接 Donor 实例。
-
执行
CLONE INSTANCE操作时,指定的 Donor 端口不能为 X Protocol 端口。
除此之外,在进行远程克隆时,还有如下要求:
-
MySQL 版本(包括小版本)、主机的操作系统和位数(32 位,64 位)、字符集相关参数(
character_set_server、collation_server和character_set_filesystem)、innodb_page_size必须一致。 -
Recipient 必须有足够的磁盘空间存储克隆数据。
-
无论是 Donor,还是 Recipient,同一时间,只能执行一个克隆操作。
-
Recipient 需要重启,所以其必须通过
mysqld_safe等进程管理工具进行管理,否则的话,实例关闭后,需手动拉起。

夜雨聆风