前言
在MySQL 8.0.17版本中引入了新的插件clone plugin。克隆插件允许克隆本地或远程MySQL服务器实例中的数据。克隆数据是存储在InnoDB中的数据的物理快照,包括模式、表、表空间和数据字典元数据。克隆的数据包括一个功能完整的数据目录,它允许使用克隆插件用于MySQL服务器配置。
clone plugin的可应用场景:
数据物理热备:(本地 or 远程)
快速构建集群从节点的复制
MGR节点的快速扩充
插件安装
首先需要安装clone plugin:(远程克隆需要在多个节点同步安装)
如果mysqld服务尚未启动,则在my.cnf中配置初始化插件加载:
[mysqld]plugin-load-add=mysql_clone.so
或者在mysql运行时加载插件,则通过:
INSTALL PLUGIN clone SONAME 'mysql_clone.so';
一.本地克隆(clone data locally)
参考文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-local.html
克隆操作需要用户具备backup_admin权限:
mysql> GRANT BACKUP_ADMIN ON *.* TO 'clone_user';
本地克隆语法:
mysql> CLONE LOCAL DATA DIRECTORY = '/path/to/clone_dir';
其中/path/to/clone_dir是数据克隆到的本地目录的完整路径。需要一个绝对路径,并且指定的目录(" clone_dir ")必须不存在,但是指定的路径必须是存在的路径。MySQL服务器必须具有创建目录所需的写访问权限
案例:
mysql > CLONE LOCAL DATA DIRECTORY = '/mysql/bak'
这里指定了不存在的路径/mysql/bak,且/mysql路径具备读写权限
这里可以看出是原始文件的克隆,可以通过克隆数据直接拉起mysql。
二.远程克隆(clone remote data)
参考文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-remote.html
远程克隆前置条件:
克隆接收方和提供方均需要clone user,在提供方上,克隆用户需要BACKUP_ADMIN权限来访问和传输来自提供方的数据,以及在克隆操作期间阻止DDL。在接收方上,克隆用户需要CLONE_ADMIN特权来替换接收方数据、在克隆操作期间阻止DDL以及自动重新启动服务器。CLONE_ADMIN特权隐含地包括BACKUP_ADMIN和SHUTDOWN特权。
克隆操作期间不允许使用 DDL,允许并发DML
克隆接收方和提供方必须有相同的mysql server版本,且必须8.0.17+
克隆接收方和提供方必须是相同的操作系统平台。
接收方必须有足够的磁盘空间存放克隆的数据。默认情况下,在克隆提供数据之前会删除接收方数据,因此只需要足够的空间来存储克隆数据。如果使用DATA directory子句克隆到一个指定目录,则必须有足够的磁盘空间用于现有的接收方数据和克隆的数据。
InnoDB允许在数据目录之外创建一些表空间类型。如果提供的MySQL服务器实例有位于数据目录之外的表空间,克隆操作必须能够访问这些表空间
克隆接收方和提供方必须具有相同的字符集和collation字符排序规则
克隆接收方和提供方必须具有相同的innodb_page_size和innodb_data_file_path参数设置
如果克隆加密或页面压缩的数据,则提供方和接收方必须具有相同的文件系统块大小
如果要克隆加密的数据,则需要配置SSL加密安全连接
克隆接收方的clone_valid_donor_list设置必须包含提供方MySQL服务器实例的主机地址
同一时间只能有一个克隆操作
克隆插件传输1MB包和元数据。因此,在提供方和接收方MySQL服务器实例上,所需的最小max_allowed_packet值为2MB
克隆接收方也需要启动mysqld服务
远程克隆语法:
远程克隆需要在接收方创建具备clone admin权限的clone user:
mysql> GRANT CLONE_ADMIN on *.* to 'recipient_clone_user';
添加克隆提供方的ip列表与端口至clone_valid_donor_list:
SET GLOBAL clone_valid_donor_list = 'example.donor.host.com:3306';
远程克隆至指定位置:(不会影响本实例)
CLONE INSTANCE FROM 'user'@'host':portIDENTIFIED BY 'password'[DATA DIRECTORY [=] 'clone_dir'][REQUIRE [NO] SSL];
远程克隆覆盖自身:(默认方式,提供方数据直接克隆到接收方,克隆后接收方实例重启)
mysql> CLONE INSTANCE FROM 'donor_clone_user'@'example.donor.host.com':3306 IDENTIFIED BY 'password';
donor_clone_user:克隆提供方user
操作案例:
克隆提供方:
克隆接收方:
执行克隆操作:
具体的克隆流程明细可以查看performance_schema.clone_progress:
SELECT STAGE, STATE, END_TIME FROM performance_schema.clone_progress;
PS:指定DATA DIRECTORY参数则不会开启RESTART和RECOVERY步骤。
克隆后,接收方与提供方数据一致:
总结:
目前调研来看,新引入的clone plugin和xtrabackup都可以用于物理热备,不过各有优劣势,在部分场景可以考虑使用操作简易的clone替代xtrabackup,如主从复制和mgr等等。可以期待官方后续clone plugin相关的更新。后续会再研究一下clone plugin和xtrabackup的原理。
免责声明:市场有风险,选择需谨慎!此文仅供参考,不作买卖依据。
关键词: