MySQL运维实战之Clone插件(10.2)Clone插件原理

俊达1年前技术文章548

clone插件实现

clone_plugin.png


clone操作主要分为几个阶段:

1、初始阶段。

初始阶段,会开启页面跟踪(Page Tracking)。开启页面跟踪后,修改过的页面的编号会被记录下来。页面的修改可分为两个阶段:首先在内存中修改(也就是在InnoDB buffer pool中修改缓存的页面数据),然后被修改的页面会在一定的时机持久化到数据文件。页面跟踪机制大概是在页面持久化的时候记录页面的编号(页面的表空间ID和Page ID)。

2、文件复制阶段。

在这一阶段,clone插件会复制所有InnoDB文件。文件复制结束后,开启InnoDB Redo归档,关闭页面跟踪。

3、页面复制阶段

这一阶段,会将文件复制阶段内跟踪到的页面复制出来。

页面复制完成后,停止Redo归档。

页面复制阶段完成后,当时的lsn记录为CLONE Lsn,这也是clone出来的数据库的lsn。

这里还会记录实例当前的复制位点,如binlog位点和gitd信息。

4、Redo复制阶段

这一阶段,处理归档出来的redo日志。应用完归档日志后,clone的数据库就是一个可以直接启动的数据库。


clone如何保证数据一致性

clone插件如何保证最终得到的数据的一致性呢?

假设clone开始时的checkpoint为ckpt 0,clone文件复制结束时的checkpoint为ckpt 1。


1、首先在clone开始时(clone start lsn),先开启了页面跟踪。开启页面跟踪后,在此之后写入文件的页面都会被记录。

2、文件复制阶段会将所有已经完成持久化的数据复制出来。这一步保证ckpt 0之前修改的数据都被复制出来。

3、文件复制过程中,数据库文件会持续更新。由于开启了页面跟踪,数据文件中更新过的页面ID都会被记录下来。关闭页面跟踪时数据库checkpoint为ckpt 1,则ckpt 0和ckpt 1之间修改的页面,都会被记录下来,这些页面在页面复制阶段处理。



4、文件复制完成后、关闭页面跟踪前,会先开启redo归档。redo归档会将日志序列号(lsn)在当前checkpoint之后的redo日志都复制到归档REDO文件中。由于redo归档是在关闭页面跟踪前开启的,所以能保证ckpt 1之后的redo日志都会被复制到归档REDO文件中。

5、页面复制结束时,可能会有部分页面的数据修改还没有刷新到磁盘。这些页面修改的序列号都在ckpt 1之后。而ckpt 1之后的redo日志都在归档redo文件中,通过重用归档redo日志,就可以将数据库恢复到一个一致的时间点(clone lsn),也就是停止redo归档时的那一刻。

参考文档:

https://dev.mysql.com/worklog/task/?id=9209


相关文章

MySQL运维实战(7)建立复制

建立复制的基本步骤1、主库开启binlog主库需要配置的关键参数server_id:主备库需要设置为不同。log_bin:binlog文件的前缀,可以指定绝对路径,也可以只指定文件名。若不指定路径,b...

MySQL运维实战之备份和恢复(8.5)xtrabackup恢复增量备份

恢复增量备份时,需要先对基础全量备份进行恢复,然后再依次按增量备份的时间进行恢复。这个例子中,相关备份文件的目录结构如下:/data/backup ├── full │ &nb...

MySQL运维实战(4.4) SQL_MODE之STRICT_TRANS_TABLES和STRICT_ALL_TABLES

如果设置STRICT模式,则如果数据写入时,如果数据不符合字段定义(字符串超出长度、数值类型数据超出范围、违反not null约束等),SQL会报错。如果不设置STRICT模式,会对异常数据进行截断处...

 MySQL运维实战(1.2)安装部署:使用二进制安装部署

MySQL运维实战(1.2)安装部署:使用二进制安装部署

一般在生产环境,我们会使用二进制安装的方式安装MySQL。使用二进制安装,在处理单机多实例、升级MySQL等场景下更加方便。如果有特殊的需求(比如要打一些patch),我们还可以自己编译二进制。1、下...

MySQL运维实战(3.3) 管理数据库(database)

数据库使用create database语句创建数据库。创建数据库的账号需要有create权限。创建数据库用户拥有create权限才能创建数据库。-- 例子:创建dba用户,拥有创建数据库名...

MySQL运维实战(4.5) SQL_MODE之NO_ZERO_DATE和NO_ZERO_IN_DATE

NO_ZERO_DATE:日期中不允许'0000-00-00'NO_ZERO_IN_DATE:日期中年、月或日不允许为0,如不允许'2021-00-01', '...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。