MySQLv8.0.17,引入插件clone plugin。

应用场景:大量数据备份和恢复、迁移

克隆方式 功能 说明
本地克隆 数据本地备份和恢复
远程克隆 快速构建主从,同步数据 在迁移过程中,除了DDL操作情况,其他操作都不会出现阻塞情况;

1、安装Clone-Plugin插件

01、安装插件

# 安装clone插件
install plugin clone soname 'mysql_clone.so';

# 修改配置文件
[mysqld]  
plugin-load-add=mysql_clone.so   # 在MySQL启动服务时加载克隆插件

# 检查clone插件是否已安装
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.00 sec)

02、卸载插件

mysql> uninstall plugin clone;

2、本地克隆

案例演示:对本地的数据库做备份,以及恢复。

01、备份数据

# 1、创建克隆账号
create user clone_user@'%' identified by '123qwe';
grant backup_admin on *.* to clone_user@'%';
# backup_admin权限是mysql8.0才有的备份导出的权限

# 2、创建目录存储备份数据
mkdir -p /data/clone_data
chown -R mysql.mysql /data/clone_data

# 3、开启本地克隆
mysql -uclone_user -p123qwe -e "clone local data directory='/data/clone_data/bak'"
注意事项:1)目录bak是本地克隆时被自动创建的,不能提前存在于数据目录中
2)如果克隆过程出现错误,必须删除克隆目录bak后,再重新开启克隆

# 新开一个session,查看克隆过程:
mysql> select stage,state,end_time from performance_schema.clone_progress;
+-----------+-------------+----------------------------+
| stage     | state       | end_time                   |
+-----------+-------------+----------------------------+
| DROP DATA | Completed   | 2023-06-02 22:15:13.209867 | # 清空克隆存储目录,确保没有旧数据残留
| FILE COPY | Completed   | 2023-06-02 22:15:13.338160 | # 文件复制阶段,主要是复制表结构等必要的文件
| PAGE COPY | Completed   | 2023-06-02 22:15:13.341496 | # 复制数据页,将表的实际数据从捐赠者复制到接受者
| REDO COPY | Completed   | 2023-06-02 22:15:13.342280 | # 复制redo log,确保目标实例在恢复时能够应用事务日志,实现数据一致性
| FILE SYNC | Completed   | 2023-06-02 22:15:13.500076 | # 将所有复制的文件同步到磁盘,确保数据写入持久化。
| RESTART   | Not Started | NULL                       | # 未开始。此阶段通常重启接受者实例,以便加载克隆的数据
| RECOVERY  | Not Started | NULL                       | # 未开始。该阶段会在接受者实例启动后应用redo log,完成恢复操作,使数据达到一致性。
+-----------+-------------+----------------------------+

# 克隆完成后,备份了哪些东西?
[root@db01 ~]# ls /data/clone_data/bak/
#clone  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.ibd  sys  undo_001  undo_002

02、恢复数据

# 1、删除MySQL数据目录(模拟损坏)
rm -rf /data/mysql/data/*

# 2、恢复克隆备份到MySQL数据目录
\cp -a /data/clone_data/bak/* /data/mysql/data/

# 3、重启数据库服务
/etc/init.d/mysqld restart

# 4、再次查看clone状态
mysql> select stage,state,end_time from performance_schema.clone_progress;
+-----------+-----------+----------------------------+
| stage     | state     | end_time                   |
+-----------+-----------+----------------------------+
| DROP DATA | Completed | 2023-06-02 22:15:13.209867 |
| FILE COPY | Completed | 2023-06-02 22:15:13.338160 |
| PAGE COPY | Completed | 2023-06-02 22:15:13.341496 |
| REDO COPY | Completed | 2023-06-02 22:15:13.342280 |
| FILE SYNC | Completed | 2023-06-02 22:15:13.500076 |
| RESTART   | Completed | 2023-06-02 22:19:23.509831 | # 已重启并对redo日志进行了回放
| RECOVERY  | Completed | 2023-06-02 22:19:25.453848 |
+-----------+-----------+----------------------------+
7 rows in set (0.00 sec)

3、远程克隆

01、远程克隆前置条件

1. 克隆接收方和提供方均需要clone user,在提供方上,克隆用户需要BACKUP_ADMIN权限来访问和传输来自提供方的数据,以及在克隆操作期间阻止DDL。在接收方上,克隆用户需要CLONE_ADMIN特权来替换接收方数据、在克隆操作期间阻止DDL以及自动重新启动服务器。CLONE_ADMIN特权隐含地包括BACKUP_ADMIN和SHUTDOWN特权。
2. 克隆操作期间不允许使用 DDL,允许并发DML
3. 克隆接收方和提供方必须有相同的mysql server版本,且必须8.0.17+
4. 克隆接收方和提供方必须是相同的操作系统平台。
5. 接收方必须有足够的磁盘空间存放克隆的数据。默认情况下,在克隆提供数据之前会删除接收方数据,因此只需要足够的空间来存储克隆数据。如果使用DATA directory子句克隆到一个指定目录,则必须有足够的磁盘空间用于现有的接收方数据和克隆的数据。
6. InnoDB允许在数据目录之外创建一些表空间类型。如果提供的MySQL服务器实例有位于数据目录之外的表空间,克隆操作必须能够访问这些表空间
7. 克隆接收方和提供方必须具有相同的字符集和collation字符排序规则
8. 克隆接收方和提供方必须具有相同的innodb_page_size和innodb_data_file_path参数设置
9. 如果克隆加密或页面压缩的数据,则提供方和接收方必须具有相同的文件系统块大小
10. 如果要克隆加密的数据,则需要配置SSL加密安全连接
11. 克隆接收方的clone_valid_donor_list设置必须包含提供方MySQL服务器实例的主机地址
12. 同一时间只能有一个克隆操作
13. 克隆插件传输1MB包和元数据。因此,在提供方和接收方MySQL服务器实例上,所需的最小max_allowed_packet值为2MB
14. 克隆接收方也需要启动mysqld服务

简而言之,远程克隆就是将捐赠者的数据通过网络传输到接受者进行恢复。

02、案例:使用远程克隆

主机名称 LAN IP 角色
db01 192.168.0.11 Donor:捐赠者(数据源)
db02 192.168.0.12 Recipient:接受者
# 1、在捐赠者db01上创建账号并授权
create user doner@'%' identified with mysql_native_password by '123qwe';
grant backup_admin on *.* to doner@'%';

# 2、在接受者db02上创建账号并授权
create user recipient@'%' identified with mysql_native_password by '123qwe';
grant clone_admin on *.* to recipient@'%';
# clone_admin杈限是mysql8.0才有的克隆同步数据的权限

# 3、在接受者db02上设置信任的捐赠者名单
set global clone_valid_donor_list='192.168.0.11:3306';
# 检查
select @@clone_valid_donor_list;

# 4、在接受者db02上开始从捐赠者拉取数据
clone instance from doner@'192.168.0.11':3306 identified by '123qwe';
注意事项:1)克隆会拉取捐赠者最新数据到本地后恢复
2)下次克隆,需要再次设置信任捐赠者清单