前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MyLoader原理简介

MyLoader原理简介

原创
作者头像
ivansqwu
修改2018-06-20 12:00:33
2.5K0
修改2018-06-20 12:00:33
举报
文章被收录于专栏:云数据库云数据库
1. 简介

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

2. 备份恢复

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

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

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

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

myloader flow
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、触发器

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 简介
  • 2. 备份恢复
  • 4. 备份的详细流程
  • 5. 几个值得关注的点
    • 主线程和子线程交互
      • 二进制日志
        • 导入参数设置
          • 对象的导入顺序
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档