本文来自:http://baiyangtx.net/2016/09/04/mydumper-principle/

相对于MySQL官方提供的逻辑备份工具 mysqldump , mydumper最大的特点就是可以采用多线程并行备份,大大提高了数据导出的速度。这里对mydumper的工作原理做个分析,看一下mydumper如何巧妙的利用Innodb引擎提供的MVCC版本控制的功能,实现多线程并发获取一致性数据。

这里一致性数据指的是在某个时间点,导出的数据与导出的Binlog文件信息相匹配,如果导出了多张表的数据,这些不同表之间的数据都是同一个时间点的数据。

在mydumper进行备份的时候,由一个主线程以及多个备份线程完成。其主线程的流程是:

  1. 连接数据库
  2. FLUSH TABLES WITH READ LOCK 将脏页刷新到磁盘并获得只读锁
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT / 开启事物并获取一致性快照
  4. SHOW MASTER STATUS 获得binlog信息
  5. 创建子线程并连接数据库
  6. 为子线程分配任务并push到队列中
  7. UNLOCK TABLES / FTWRL / 释放锁

子线程的主要流程是:

  1. 连接数据库
  2. SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE
  3. START TRANSACTION /!40108 WITH CONSISTENT SNAPSHOT /
  4. 从队列中pop任务并执行

上述两个线程的流程的关系如图

从图中可以看到,主线程释放锁是在子线程开启事物之后。这里是保证子线程获得的数据一定为一致性数据的关键。
主线程在连接到数据库后立即通过Flush tables with read lock(FTWRL) 操作将脏页刷新到磁盘,并获取一个全局的只读锁,这样便可以保证在锁释放之前由主线程看到的数据是一致的。然后立即通过 Start Transaction with consistent snapshot 创建一个快照读事物,并通过 show master status获取binlog位置信息。
然后创建完成dump任务的子线程并为其分配任务。

主线程在创建子线程后通过一个异步消息队列 ready 等待子线程准备完毕。 子线程在创建后立即创建到MySQL数据库的连接,然后设置当前事务隔离级别为Repeatable Read。
设置完成之后开始快照读事务。在完成这一系列操作之后,子线程才会通过ready队列告诉主线自己程准备完毕。主线程等待全部子线程准备完毕开启一致性读Snapshot事务后才会释放全局只读锁(Unlock Table)。

如果只有Innodb表,那么只有在创建任务阶段会加锁。但是如果存在MyIsam表或其他不带有MVCC功能的表,那么在这些表的导出任务完成之前都必须对这些表进行加锁。Mydumper本身维护了一个 non_innodb_table 列表,在创建任务阶段会首先为非Innodb表创建任务。同时还维护了一个全局的unlock_table队列以及一个原子计数器 non_innodb_table_counter , 子线程每完成一个非Innodb表的任务便将 non_innodb_table_counter 减一,如果non_innodb_table_counter 值为0 遍通过向 unlock_table 队列push一个消息的方式通知主线程完成了非Innodb表的导出任务可以执行 unlock table操作。

mydumper支持记录级别的并发导出。在记录级别的导出时,主线程在做任务分配的时候会对表进行拆分,为表的一部分记录创建一个任务。这样做一个好处就是当有某个表特别大的时候可以尽可能的利用多线程并发以免某个线程在导出一个大表而其他线程处于空闲状态。在分割时,首先选取主键(PRIMARY KEY)作为分隔依据,如果没有主键则查找有无唯一索引(UNIQUE KEY)。在以上尝试都失败后,再选取一个区分度比较高的字段做为记录划分的依据(通过 show index 结果集中的cardinality的值确定)。

划分的方式比较暴力,直接通过 select min(filed),max(filed) from table 获得划分字段的取值范围,通过 explain select filed from table 获取字段记录的行数,然后通过一个确定的步长获得每一个子任务的执行时的where条件。这种计算方式只支持数字类型的字段。

以上就是mydumper的并发获取一致性数据的方式,其关键在于利用了Innodb表的MVCC功能,可以通过快照读因此只有在任务创建阶段才需要加锁。

转载于:https://www.cnblogs.com/zhoujinyi/p/6240445.html

MySQL备份mydumper的原理【转】相关推荐

  1. mysql的备份恢复原理_MySQL备份恢复-mysqldump原理

    +++++++++++++++++++++++++++++++++++++++++++ 标题:mysqldump对MySQL数据库备份恢复原理 时间:2019年2月23日 内容:mysqldump工具 ...

  2. mysql备份工具 :mysqldump mydumper Xtrabackup 原理

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...

  3. MySQL备份原理详解

    备份是数据安全的最后一道防线,对于任何数据丢失的场景,备份虽然不一定能恢复百分之百的数据(取决于备份周期),但至少能将损失降到最低.衡量备份恢复有两个重要的指标:恢复点目标(RPO)和恢复时间目标(R ...

  4. MariaDB/MySQL备份和恢复(三):xtrabackup用法和原理详述

    MariaDB/MySQL备份恢复系列: 备份和恢复(一):mysqldump工具用法详述 备份和恢复(二):导入.导出表数据 备份和恢复(三):xtrabackup用法和原理详述 xtrabacku ...

  5. 05-雷海林-mysql备份原理与在TDSQL中的实践

    05-雷海林-mysql备份原理与在TDSQL中的实践 F F F F F F F F F F F F F F F F F F F F F F F F F F F 下载地址: http://files ...

  6. java实现mysql增量备份_企业级MySQL备份原理

    企业级MYSQL备份恢复原理 1. 全量备份 全量数据就是数据库中所有的数据,全量备份就是把数据库中所有的数据进行备份. 例如: 备份所有库: # mysqldump -uroot -poldboy ...

  7. “三高“Mysql - Mysql备份概览

    本篇内容侧重Mysql备份的基本原理和常用介绍为主,大部分为理论相关的内容. 数据备份在平时的工作和学习中可能使用得比较少,但是对于一个线上项目来说却是不可或缺的一环,对于开发人员来说熟悉和了解备份的 ...

  8. MySQL备份恢复-mysqldump/xbk

    MySQL备份恢复 1.介绍 最后一根救命稻草,备份主要是用来恢复数据 2.DBA在备份恢复工作职责 2.1设计备份策略和恢复策略 1.备份策略 1)备份的时间 凌晨,根据公司的实际业务情况,一般选择 ...

  9. mysql备份到带库_MySQL数据备份

    MySQL数据备份 一. MySQL数据损坏类型 1.1.物理损坏 磁盘损坏: 硬件,磁道坏,dd,格式化 文件损坏: 数据文件损坏,redo损坏 1.2.逻辑损坏 drop delete trunc ...

最新文章

  1. javascript中五句话
  2. python--html to pdf
  3. 《数据库系统实训》实验报告——单表查询
  4. 对pca降维后的手写体数字图片数据分类_python机器学习API介绍13: 数据降维及主成分分析...
  5. SAP Spartacus storefront.component.html 怎么关联到其他的页面
  6. 拥抱开源, Office 365开发迎来新时代
  7. Valid BFS? CodeForces - 1037D(思维 bfs)
  8. 信息学奥赛一本通 1051:分段函数 | OpenJudge NOI 1.4 13
  9. SQL Server中 sysobjects、syscolumns、systypes
  10. 年总结(二):历经一年的蜕变
  11. vscode-go 插件安装
  12. 解决curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused
  13. python3的encode()和decode()
  14. 原子结构示意图全部_原子结构示意图的分类和详细知识点
  15. win8 配置要求
  16. java版Spring Cloud+短视频带货 b2b2c多商户分布式微服务
  17. memcached 源码分析
  18. 圭尔夫大学计算机科学硕士,圭尔夫大学到底有多高大上?你可能还不知道
  19. latex数字引用参考文献
  20. 有关计算机网络ppt素材,《计算机网络工程》ppt素材

热门文章

  1. springboot yml对于list列表配置方式
  2. utf8 和utf8mb4 的区别
  3. RabbitMQ交换器Exchange
  4. Android开发笔记(一百五十七)使用OpenGL实现翻书动画
  5. 使用try-with-resources优雅的关闭IO流
  6. 理解C++ dynamic_cast
  7. CentOS7文本模式下配置及安装KVM虚拟机
  8. Android 动态移动控件实现
  9. 算法之【大整数乘法】
  10. 浅析java中clone()方法