提起mydumper,首先让人想到的是相对于mysqldump的多线程逻辑备份工具,而往往会忽略同是mydumper项目下的myloader工具。myloader是与mydumper工具备份配合使用的多线程备份恢复工具,可以直接以mydumper输出文件为输入,恢复备份数据。
相对于mydumper来说,myloader的逻辑会简单很多。如果熟悉mydumper的原理和实现,或者有看过mydumper原理详解,那么理解myloader的流程只需要重点关注几个点就好了。
与备份导出不一样,备份恢复的过程不涉及到一致性位点的问题,主要关注的点有:
1、如何实现多线程并行导入,子线程与主线程如何交互
2、导入对象(包括表结构、数据、视图、触发器、存储过程、事件等)的顺序应该是怎样的
3、如何设置session参数加快导入速度等
myloader恢复数据的详细流程如下
流程图中的步骤基本与源码中的函数名称对应,可以将源码与流程图对照来看。
从上面的详细流程图上可以看到,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 删除。