mydumper原理

来源:互联网 发布:synchronized的优化 编辑:程序博客网 时间:2024/04/30 14:33

关于mysql的逻辑导出目前的工具有mysqldump、mysqlpump、mydumper 这三个工具。其中mysqldump是单线程的导出。mysqldump是mysql5.7新增加的一个工具,多线程的并行导出,但是其是表级别的并行(对于单个表还是不能并行)。mydumper是开源的一个多线程并行逻辑导出工具,且是行级别的并行导出。


mydumper原理


主线程负责建立数据一致性备份点、初始化工作线程和为工作线程推送备份任务:

1、对备份实例加读锁,阻塞写操作以建立一致性数据备份快照点,记录备份点BinLog信息;
2、创建工作线程,初始化备份任务队列,并向队列中推送数据库元数据(schema)、非InnoDB表和InnoDB表的备份任务;
3、工作线程负责将备份任务队列中的任务按顺序取出并完成备份:
4、分别建立与备份实例连接,将session的事务级别设置为repeatable-read,用于实现可重复读;
5、在主线程仍持有全局读锁时开启事务进行快照读,这样保证了读到的一致性数据与主线程相同,实现了备份数据的一致性;
6、按序从备份任务队列中取出备份任务,工作线程先进行MyISAM等非InnoDB表备份,再完成InnoDB表备份;这样可以在完成非InnoDB表备份通知后主线程释放读锁,尽可能减小对备份实例业务的影响;

mydumper的记录级备份由主线程负责任务拆分,由多个工作线程完成。主线程通过将表数据拆分为多个chunk,每个chunk作为一个备份任务。表数据拆分方式如下所述:mydumper优先选择主键索引的第一列作为chunk划分字段,若不存在主键索引,则选择第一个唯一索引作为划分依据,若还不存在,则选择区分度(Cardinality)最高的任意索引。如果还是无法满足,则只能进行表级的并行备份。在确定了chunk划分字段后,先获取该字段的最大和最小值,再通过执行“explain select field from db.table”来估计该表的记录数,最后根据所设的每个任务(文件)记录数来将该表划分为多个chunk。

mydumper的缺点:

没有可用的参数配置导出的字符集。在代码里写死的SET NAMES binary(即就是不做任何字符集转换)。

如果源库和目标库是不同字符集,是有点麻烦。



参考: http://www.innomysql.com/article/25456.html

0 0
原创粉丝点击