MyLoader原理简介

1. 简介

提起mydumper,首先让人想到的是相对于mysqldump的多线程逻辑备份工具,而往往会忽略同是mydumper项目下的myloader工具。myloader是与mydumper工具备份配合使用的多线程备份恢复工具,可以直接以mydumper输出文件为输入,恢复备份数据。

2. 备份恢复

相对于mydumper来说,myloader的逻辑会简单很多。如果熟悉mydumper的原理和实现,或者有看过mydumper原理详解,那么理解myloader的流程只需要重点关注几个点就好了。

与备份导出不一样,备份恢复的过程不涉及到一致性位点的问题,主要关注的点有:

1、如何实现多线程并行导入,子线程与主线程如何交互
2、导入对象(包括表结构、数据、视图、触发器、存储过程、事件等)的顺序应该是怎样的
3、如何设置session参数加快导入速度等

4. 备份的详细流程

myloader恢复数据的详细流程如下

myloader flow

流程图中的步骤基本与源码中的函数名称对应,可以将源码与流程图对照来看。

5. 几个值得关注的点

从上面的详细流程图上可以看到,myloader的任务执行模型与mydumper是一样的,默认有四个子线程。主线程负责主逻辑,子线程为worker线程,执行具体的任务。

主线程和子线程交互

主线程负责导入库表结构,创建异步导入任务以及结束任务放入阻塞队列,等待子线程执行完所有的任务并退出,主线程等待子线程退出后,接着导入其他对象。

二进制日志

主线程和子线程默认情况下都执行了set sql_log_bin = 0,在导入的过程中不写入binlog。默认情况下加快了数据导入的速度,也避免写重复的数据。不过在某些情况下,不计入binlog会导致一些麻烦,比如主从同步条件下导入数据到主库,有下游服务依赖于binlog来获取数据库的变更等。

导入参数设置

主线程的mysql session在开始时就设置了set foreign_key_checks = 0,不检查外键。原因是,在restore database步骤中主线程会阻塞的创建所有的表,在创建的过程中检查外键很可能导致表创建失败。

子线程在创建之初也会设置mysql session的参数set unique_checks = 0,不检查唯一键。这个参数会加快数据的导入速度。不检查唯一键是基于库表结构和数据是由mydumper导出的,如果之前都已经成功导出,导入时检查唯一性就是冗余的操作。

对象的导入顺序

对象的恢复顺序与mydumper导出的过程正好相反。在具体分配任务的时候,对象在mydumper和myloader与主线程、子线程的对应关系略有不同。

1、库表结构
2、每个库表的具体数据
3、存储过程、函数、事件
4、视图
5、触发器

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏中国Android研究院

如何在低版本SDK调用高版本API?

随着Android SDK版本不断的迭代更新,在新的SDK上总是会出现让人眼前一亮非常方便好用的API。但是这些新的API呢在低版本的SDK上是没有的,所以当我...

1590
来自专栏流柯技术学院

windows下命令行打jar包方法

         事先必须编译好需要打jar的class。(eclipse一般在bin,maven构建的在target/classes)

801
来自专栏数据之美

python 日志模块 logging 详解

Java 中最通用的日志模块莫过于 Log4j 了,在 python 中,也自带了 logging 模块,该模块的用法其实和 Log4j 类似。 Python ...

2987
来自专栏架构之路

Linux wait() 和 waitpid()函数介绍

转载自http://blog.csdn.net/wallwind/article/details/6998602 ---- 当一个进程正常或异常终止的时候,内核...

3275
来自专栏LIN_ZONE

Linux 定时任务调度(crontab命令)

在以上各个字段中,还可以使用以下特殊字符: 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件...

722
来自专栏我叫刘半仙

手写一个简化版Tomcat

      Tomcat作为Web服务器深受市场欢迎,有必要对其进行深入的研究。在工作中,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能...

3285
来自专栏我是攻城师

ElasticSearch并发操作之乐观锁的使用

3563
来自专栏Janti

redis学习笔记

Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位...

3619
来自专栏别先生

JSch - Java实现的SFTP(文件上传详解篇)

  JSch是Java Secure Channel的缩写。JSch是一个SSH2的纯Java实现。它允许你连接到一个SSH服务器,并且可以使用端口转发,X11...

1121
来自专栏上善若水

004-IntelliJ IDEA导出Java 可执行Jar包

保证自己的Java代码是没有问题的,在IDEA里面是可以正常运行的,然后,按下面步骤:

932

扫码关注云+社区