clone plugin(8017+)
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)下次克隆,需要再次设置信任捐赠者清单
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,完整转载请注明来自 athos.lau