mysql 8.0.17引入clone plugin,允许从本地或者远程的MySQL中克隆数据克隆的数据包括schema、表、表空间、元数据等等,克隆的数据是一个完整的数据目录,插件可以使用克隆的目录配置和恢复一个MySQL Server,克隆分为本地克隆和远程克隆。

远程克隆:涉及到启动克隆操作的本地MySQL称为recipient(数据接收方),远端的源数据MySQL称为donor(捐赠者)。通过网络传输的方式将donor数据克隆到recipient的指定目录。如果不指定则会将接收方数据目录中的所有数据替换为克隆的数据。

1 主库需要开启GTID

2 安装clone plugin插件

  • Master、Slave动态插件安装(重启后丢失)
1
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
  • Master、Slave 静态配置
1
2
3
4
5
[mysqld]

plugin-load-add=mysql_clone.so

clone=FORCE_PLUS_PERMANENT
  • 检查插件是否加载成功
1
2
3
4
5
6
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone | ACTIVE |
+-------------+---------------+
1 row in set (0.09 sec)

3 Master配置

在主库中操作,创建一个具有BACKUP_ADMIN备份权限的账号

1
2
3
mysql> create user clone_server@'%' identified by 'clone-server';

mysql> grant backup_admin on *.* to clone_server@'%';

Slave配置

以下均在从库中进行

创建具有CLONE_ADMIN权限的账号

1
2
3
mysql> create user clone_client@'%' identified by 'clone-client';

mysql> grant clone_admin on *_.*_ to clone_client@'%';

配置源IP信息(主库IP)

1
mysql> set global clone_valid_donor_list='mysql-primary:3306' ;

流量限制(可选)

1
2
#最大流量30MB
mysql> set global clone_max_data_bandwidth=30;

开始远程克隆数据库

1
mysql> clone instance from clone_server@'mysql-primary':3306 identified by 'clone-server';

同步完自动重启

注意提前修改从库的gtid配置,从库也需要以gtid模式起来,不然后面重建slave会报错ERROR 1777 (HY000): CHANGE MASTER TO MASTER_AUTO_POSITION = 1 cannot be executed because @@GLOBAL.GTID_MODE = OFF.

1
2
3
4
cat >> /etc/my.cnf <<EOF
gtid-mode=ON
enforce-gtid-consistency=on
EOF

重建slave

1
2
mysql> CHANGE MASTER TO MASTER_HOST='mysql-primary', MASTER_USER='replicator', MASTER_PASSWORD='sylink', MASTER_AUTO_POSITION =1;
mysql> start slave;