简介说明
官方文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin.html
MySQL 是在 8.0.17+后,加入了克隆插件(Clone Plugin)
功能
克隆插件允许在本地或从远程 MySQL 实例克隆数据。克隆数据是存储在 Innodb 其中的数据的物理快照,其中包含库、表、表空间
和 数据字典元数据
。克隆的数据包含一个功能齐全的数据目录,允许克隆插件进行 MySQL 服务器配置。
注意:Clone Plugin 只能备份 Innodb 存储引擎表,其它类型表不进行备份
克隆插件支持方式原理说明
本地克隆
本地克隆操作将启动克隆操作的 MySQL 服务器实例中的数据克隆到同服务器或同节点上的一个目录里 原理如下图:
远程克隆
默认情况下,远程克隆操作会删除 接受者(Recipient)
数据目录中的数据,并将其替换为 捐赠者(donor)
的克隆数据。或者也可以将数据克隆到 接受者
的其它目录,以免删除现有数据。 原理如下图:
远程克隆操作和本地操作克隆的数据没有区别,数据是相同的。
克隆插件支持复制除了克隆数据外,还可以从捐赠者
中提取并传输复制位置信息,并将其应用于 接受者
,从而可以使用克隆插件来配置组服务器或主从复制。使用克隆查看进行配置比复制大量事务要快得多,效率更高。
XtraBackup 和 Clone Plugin 备份过程区别
XtraBackup 物理备份过程
上图可以看出 XtraBackup 物理备份过程用时 30分钟,经历了 4个过程:
- 重做日志文件拷贝
- Innodb 文件拷贝
- 保存二进制日志点位(通过加FTWRL全局锁)
- 拷贝其他非 Innodb 文件
注意:XtraBackup 的备份过程中 redo copy 这个操作是持续整个备份周期的,即 redo copy 进行了整整 30 分钟,若通过备份文件进行恢复,恢复到的时间点是 15:30。
Clone Plugin 物理备份
上图可以看出,Clone Plugin 的 redo copy 过程非常短,不需要备份 30分钟内所产生的 所有 redo log,这代表着通过 Clone Plugin 恢复物理备份的速度要远远快于 XtraBackup
在 redo copy 前有一个 page copy,这个 XtraBackup 没有的步骤。也就是说在备份完 Innodb 磁盘文件后,Clone Plugin 还会对 Buffer Pool 中的脏页进行备份,这样可以减少对于 redo 日志的拷贝。
脏页的备份会先对(space,page_nubmer
) 排序,以比较顺序的方式写入备份文件。 同时,为了记录在拷贝脏页过程中,又有新的变化产生,所以在 file copy
后启用 page tracking 的机制,记录当前已经 checkpoint 完成的 LSN号。
后续的 redo copy 只需要拷贝该 LSN 之后的重做日志即可。
对比 XtraBackup,Clone Plugin 额外实现如下功能:
page copy
: 拷贝脏页,减少重做日志的被分量,提升恢复速度;
page tracking
: 记录 LSN 的变化,用于后续重做日志的备份;
redo archiving
: 备份重做日志,避免重做日志文件写入太快,覆盖写入无法备份的场景。
- Clone Plugin 支持远程备份,XtraBackup 只能本地备份。
实战示例说明
基础配置
安装克隆插件 文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-installation.html
启动前
运行中加载
检查 Clone Plugin 是否启用
设置强制启动失败参数
说明:如果克隆插件对应用场景非常重要,可以设置参数clone=FORCE_PLUS_PERMANENT
或者 clone=FORCE
,作用是如果插件未成功初始化,就会强制mysqld 启动失败
需要的权限
需要有备份锁的权限,备份锁是 MySQL 8.0 的新特性之一,比5.7版本的 FTWRL 锁要轻量。
本地克隆
文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-local.html
执行本地克隆
本地克隆的步骤如下:
- DROP DATA
- FLIE COPY
- PAGE COPY
- REDP COPY
- FLIE SYNC
观察方法如下:
使用备份目录直接启动一个克隆实例
远程备份
官方文档:https://dev.mysql.com/doc/refman/8.0/en/clone-plugin-remote.html
远程克隆的前提条件和限制
捐赠者
和接受者
都需要安装克隆插件
捐赠者
和接受者
分别需要有至少 BACKUP_ADMIN/CLONE_ADMIN
权限的账号,说明了接受者
必须先启动一个数据库实例(空或有数据的实例均可,因为完成克隆都会被删除)
克隆目标目录必须有写入权限
克隆操作期间不允许使用DDL,允许并发DML。要求相同版本好,无法在MySQL5.7和MySQL8.0之间进行克隆,而且要求版本 >= 8.0.17
同一平台同一架构
足够的磁盘空间
可以克隆操作一般表空间,但必须要有目录权限,不支持克隆使用绝对路径创建的一般表空间,与源表空间文件具有相同路径的克隆表空间文件将导致冲突
远程克隆时,不支持CLONE INSTANCE FROM 中通过使用 mysqlx 的端口
克隆插件不支持克隆 MySQL服务器配置文件 my.cnf 等
克隆插件不支持克隆二进制日志
克隆插件仅克隆 Innodb存储引擎的数据,不支持克隆其它存储引擎数据。Myisam 并且CSV存储在包括sys模式的任何模式中的表都被克隆为空表。
不支持通过 MySQL router 连接到 捐赠者
实例
一些参数是必须一致的,例如 innodb_page_size、innodb_data_file_path、lower_case_table_names
如果克隆加密或页面压缩数据,则捐赠者
和接受者
必须具有相同的文件系统块大小
如果需要克隆加密数据,则需要安全连接
clone_vaild_donor_list
在接受者
的设置必须包含捐赠者
MySQL服务器实例的主机地址
必须没有其它克隆操作正在运行。一次只允许一次克隆操作,要确定克隆操作是否正在运行,请查询该 performance_schema.clone_status
表
默认情况下,克隆数据会自动重新启动接受者
实例。要自动重新启动,必须在接收方提供监视进程以检测服务器是否已关闭。否则,在克隆数据后,克隆操作将停止并出现如下报错,并且关闭接受者
MySQL服务器实例
远程克隆实战
假设前提条件都满足,步骤如下: 和本地克隆一样,远程克隆需要插件安装和用户授权。捐赠者
、接受者
的授权略有不同
1. 确保捐赠者
和接受者
都安装了克隆插件
2.用户账号授权
捐赠者
授权
接受者
授权
3.接受者
设置捐赠者
列表清单
4.接受者
开始拉取克隆捐赠者
数据
5.远程克隆步骤如下
实验小结:克隆插件与xtrabackup的对比
克隆插件和XtraBackup备份都属于物理热备,备份恢复原理也近似;
克隆在恢复实例时需要先启动一个是实例并授权,而XtraBackup不需要;
XtraBackup 在 backup后需要 apply log,克隆是类似 mysqlbackup 提供的 backup-and-apply log 两个步骤合并在一起
XtraBackup 备份文件的权限等于执行命令人的权限,恢复实例时需要收回实例权限,克隆备份后权限和原数据权限一直,无需再 chown 回收权限
XtraBackup 恢复时需要在 mysqld 中执行 reset master,然后 set global gtid_purged='UUID:NUMBER'
,具体的 UUID:NUMBER
的值为备份文件中的 XtraBackup_info 文件的内容,克隆不需要这个操作步骤,默认克隆完就可以建立复制了
XtraBackup 备份完一般是 scp 拷贝到另外一台机器恢复,走的是 22
端口; 克隆走的是 MySQL 的监听端口。所以在目录权限正确的情况下,甚至根本不需要登录 Linux 服务器的权限。如下:
利用克隆建立主从复制
克隆出来的接受者实例
,可以与捐赠者
建立主从复制。建立组复制也是可以的 组复制可以参考官方文档18.4.3.1节“克隆分布式恢复”。 https://dev.mysql.com/doc/refman/8.0/en/group-replicatio
建立GTID主从复制
传统复制,通过如下命令查看 position 位置
GTID复制时,通过以下命令查看GTID位置
在捐赠者主实例创建复制账号并授权
在接受者实例上建立GTID主从复制关系
监控克隆操作
检查克隆进度
检查克隆是否出错
检查克隆次数
随时可以kill掉克隆
总结
克隆功能操作简单,可以用于快速搭建、恢复主从复制或组复制,可以部分取代开源热备软件xtrabackup