浅析mydumper(代码片段)

91洲际哥的笔记 91洲际哥的笔记     2022-11-10     149

关键词:

Ⅰ、背景

  • mysqldump单线程备份,很慢
  • 恢复慢,一张表一张表恢复,
  • 如果备份了100G的数据,想恢复其中一个表,做不到(所有的表都在一个文件里)

所以推荐使用mydumper备份

  • 备份并行,基于行,即使一张表也能并行,好强呐
  • 恢复也是并行
  • 恢复的时候可以只恢复指定表

完美(*^__^*)

Ⅱ、安装

yum install -y  glib2-devel mysql-devel zlib-devel pcre-devel openssl-devel cmake gcc gcc-c++
cd /usr/local/src
git clone https://github.com/maxbube/mydumper
cd mydumper
cmake .
make -j 4
make install
export LD_LIBRARY_PATH="/usr/local/mysql/lib:$LD_LIBRARY_PATH"

Ⅲ、参数介绍

参数和mysqldump很多一样

-G --triggers
-E --events
-R --routines
--trx-consistency-only    等于--single-transaction
-t 开几个线程,默认4个
-o 备份到指定目录
-x 正则匹配
-c 压缩
-B 指定数据库
-T 指定表
-F --chunk-filesize 指定文件大小
--rows 100000   每10w行导出到一个文件

Ⅳ、玩两手

4.1 备份

[[email protected]_0_5_centos backup]# mydumper -G -E -R --trx-consistency-only -t 4 -c -B dbt3 -o /mdata/backup
另开一个会话看下show processlist;可以看到四个线程
([email protected]) [(none)]> show processlist;
+--------+------+------------------+------+---------+------+-------------------+----------------------------------------------------------+
| Id     | User | Host             | db   | Command | Time | State             | Info                                                     |
+--------+------+------------------+------+---------+------+-------------------+----------------------------------------------------------+
| 137488 | root | 172.16.0.5:53046 | NULL | Query   |    0 | starting          | show processlist                                         |
| 137523 | root | 172.16.0.5:53546 | NULL | Query   |    3 | Sending to client | SELECT /*!40001 SQL_NO_CACHE */ * FROM `dbt3`.`customer` |
| 137524 | root | 172.16.0.5:53548 | NULL | Query   |    3 | Sending to client | SELECT /*!40001 SQL_NO_CACHE */ * FROM `dbt3`.`lineitem` |
| 137525 | root | 172.16.0.5:53550 | NULL | Query   |    1 | Sending to client | SELECT /*!40001 SQL_NO_CACHE */ * FROM `dbt3`.`partsupp` |
| 137526 | root | 172.16.0.5:53552 | NULL | Query   |    3 | Sending to client | SELECT /*!40001 SQL_NO_CACHE */ * FROM `dbt3`.`orders`   |
+--------+------+------------------+------+---------+------+-------------------+----------------------------------------------------------+
5 rows in set (0.00 sec)

tips:

mydumper参数和其所跟的值不能连在一起,不然会报错

option parsing failed: Error parsing option -r, try --help

4.2 分析备份内容

进入备份目录

[[email protected]_0_5_centos backup]# ll
total 1200340
ll
total 305044
-rw-r--r-- 1 root root       281 Jan 24 10:41 dbt3.customer-schema.sql.gz
-rw-r--r-- 1 root root   9173713 Jan 24 10:41 dbt3.customer.sql.gz
-rw-r--r-- 1 root root       401 Jan 24 10:41 dbt3.lineitem-schema.sql.gz
-rw-r--r-- 1 root root 221097124 Jan 24 10:42 dbt3.lineitem.sql.gz
-rw-r--r-- 1 root root       228 Jan 24 10:41 dbt3.nation-schema.sql.gz
-rw-r--r-- 1 root root      1055 Jan 24 10:41 dbt3.nation.sql.gz
-rw-r--r-- 1 root root       294 Jan 24 10:41 dbt3.orders-schema.sql.gz
-rw-r--r-- 1 root root  47020810 Jan 24 10:41 dbt3.orders.sql.gz
-rw-r--r-- 1 root root       264 Jan 24 10:41 metadata

篇幅有限未将所有表列出来

发现基于每张表备份并产生压缩文件,所以恢复的时候可以指定某张表恢复

喽一眼

[[email protected]_0_5_centos backup]# cat metadata
Started dump at: 2018-01-24 10:35:50
SHOW MASTER STATUS:
    Log: bin.000001
    Pos: 154
    GTID:

Finished dump at: 2018-01-24 10:35:50

metadata文件记录二进制日志位置(master-data=1)

打开压缩文件

[[email protected]_0_5_centos backup]# gunzip dbt3.customer-schema.sql.gz dbt3.customer.sql.gz dbt3-schema-create.sql.gz

[[email protected]_0_5_centos backup]# cat dbt3-schema-create.sql
CREATE DATABASE `dbt3` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;

[[email protected]_0_5_centos backup]# cat dbt3-schema-create.sql
CREATE DATABASE `dbt3` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
[[email protected]_0_5_centos backup]# cat dbt3.customer-schema.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;

CREATE TABLE `customer` (
  `c_custkey` int(11) NOT NULL,
  `c_name` varchar(25) DEFAULT NULL,
  `c_address` varchar(40) DEFAULT NULL,
  `c_nationkey` int(11) DEFAULT NULL,
  `c_phone` char(15) DEFAULT NULL,
  `c_acctbal` double DEFAULT NULL,
  `c_mktsegment` char(10) DEFAULT NULL,
  `c_comment` varchar(117) DEFAULT NULL,
  PRIMARY KEY (`c_custkey`),
  KEY `i_c_nationkey` (`c_nationkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

[[email protected]_0_5_centos backup]# head -5 dbt3.customer.sql
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;
/*!40103 SET TIME_ZONE=‘+00:00‘ */;
INSERT INTO `customer` VALUES
(1,"Customer#000000001","j5JsirBM9PsCy0O1m",15,"25-989-741-2988",711.56,"BUILDING","regular, regular platelets are fluffily according to the even attainments. blithely iron"),

综上:

文件 作用
-schema.sql 每张表的表结构
.sql 数据文件
-schema-create.sql.gz 创建库

4.3 恢复

恢复使用myloader命令

-d 恢复文件目录
-t 指定线程数
-B 指定库
[[email protected]_0_5_centos mdata]# myloader -d /mdata/backup -t 4 -B test

tips:

SSD上开4线程比source单线程快将近两倍(hdd盘可能性能提升会受一定影响)

Ⅴ、mydumper原理:

这里有了mysqldump的基础就不开glog详细分析了

核心问题:并行怎么做到的?一张表都能并行导出,还要保持一致性

step1:

session1(主线程):

flush tables with read lock; 整个数据库锁成只读,其他线程只能读,不能写,针对myisam做的

start transaction with consistent snapshot 开启一致性快照事务,针对innodb做的

show master status 获取二进制文件位置点

step2:

主线程创建执行备份任务的子线程并切换到事务隔离级别为rr

session2:start transaction with consistent snapshot;

session3:start transaction with consistent snapshot;

session4:start transaction with consistent snapshot;

这样多个线程读到的内容是一致的

step3:

备份no-innodb

step4:

session1:unlock tables;

备份innodb至备份结束

小结:

从整个流程来看,多个线程看到的数据是一致的,所以select各个表,搞出来的数据是一致的,其实就是利用了mvcc的特性(不谈非innodb的话)

问题:
一张表怎么并行?

  • 单表并行的前提是表中必须有唯一索引,且唯一索引必须是整型,不能是复合索引
  • 先检测唯一索引,根据唯一索引对表进行分片再进行备份,提前切好,区间先算好(不是每个区间相等),show processlist;中可以看出来

mydumper安装(代码片段)

mydumper安装编译安装下载安装包上传软件解压安装依赖包cmake编译安装验证缺少库文件测试总结rpm包安装下载安装包安装测试遗留问题mydumper是社区开源产品,支持并行导出,导入。功能单一,当我们在进行逻辑备份时... 查看详情

mydumper备库备份注意事项(代码片段)

1、备库备份报错mydumper-uroot-pxxxx--trx-consistency-only-Btest-Tt1,t2-o/backup/mysql/`date+%F`**(mydumper:19792):WARNING**:Usingtrx_consistency_only,binlogcoordinateswillnotbeaccurateifyouarewritingtonontransactionaltables.**(mydumper:19792):CRITICAL**:TherearequeriesinPROCESSLISTrunninglong... 查看详情

mydumper工作原理解析(代码片段)

1、简介逻辑备份小钢炮--mydumper是针对MySQL的高性能多线程备份工具。该工具是由MySQL、Facebook、skysql公司的开发人员一起开发的。是由轻量级C语言开发;执行速度据说比mysqldump快10倍;支持事务和非事务表的一致性备份;还支持... 查看详情

mydumper安装(代码片段)

mydumper安装编译安装下载安装包上传软件解压安装依赖包cmake编译安装验证缺少库文件测试总结rpm包安装下载安装包安装测试遗留问题mydumper是社区开源产品,支持并行导出,导入。功能单一,当我们在进行逻辑备份时... 查看详情

mydumper安装(代码片段)

mydumper安装编译安装下载安装包上传软件解压安装依赖包cmake编译安装验证缺少库文件测试总结rpm包安装下载安装包安装测试遗留问题mydumper是社区开源产品,支持并行导出,导入。功能单一,当我们在进行逻辑备份时... 查看详情

使用mysqldump或mydumper配置mysql主从复制(代码片段)

1.使用mysqldumpcatdump_and_replication.sh#!/bin/bashsource~/.bashrcmysql-uroot-p123456-S/data/3306/mysqldata/mysql.sock-Ddb1-e"setglobalsql_log_bin=0;altertablet1dropprimarykey,dropindexIndex_1, 查看详情

使用mysqldump或mydumper配置mysql主从复制(代码片段)

1.使用mysqldumpcatdump_and_replication.sh#!/bin/bashsource~/.bashrcmysql-uroot-p123456-S/data/3306/mysqldata/mysql.sock-Ddb1-e"setglobalsql_log_bin=0;altertablet1dropprimarykey,dropindexIndex_1, 查看详情

使用mysqldump或mydumper配置mysql主从复制(代码片段)

1.使用mysqldumpcatdump_and_replication.sh#!/bin/bashsource~/.bashrcmysql-uroot-p123456-S/data/3306/mysqldata/mysql.sock-Ddb1-e"setglobalsql_log_bin=0;altertablet1dropprimarykey,dropindexIndex_1, 查看详情

mydumper备份工具(代码片段)

...velzlibgcc-c++gcccmakecd/usr/local/src/&&wgethttps://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gztarzxfmydumper-0.9.1.tar.gzcdmydumper-0.9.1/cmake.makemakeinstallmydumper参数解释-B,--database要备份的数据库,不指定则备份所有库-T,--tables-list需要备... 查看详情

busybox浅析(代码片段)

目录busybox(一)浅析引入读取inittab创建执行脚本链表执行脚本小结title:busybox(一)浅析tag:armdate:2018-11-1323:02:33---busybox(一)浅析源码包在busybox-1.7.0.tar.bz2,一个命令对应着一个c文件,执行init命令,则是有init.c,有函数init_mainintinit_main(intar... 查看详情

mysql逻辑物理备份测试(代码片段)

...备份mysqldump普通备份mysqlpump并行备份mysqlpump压缩并行备份mydumper并行备份mydumper并行压缩备份小结物理备份xtrabackup压缩备份xtrabackup并行压缩备份innobackupex并行压缩备份innobackupexxbstream流式备份innobackupexxbstream流式压缩并行备份innob... 查看详情

flinkflink1.12.2源码浅析:streamtask浅析(代码片段)

1.概述转载:Flink1.12.2源码浅析:StreamTask浅析在Task类的doRun方法中,首先会构建一个运行环境变量RuntimeEnvironment.然后会调用loadAndInstantiateInvokable方法来加载&实例化task的可执行代码.可以看一下loadAndInstantiateInvokable方法会根据... 查看详情

callablefuturefuturetask浅析(代码片段)

1、Callable<V>接口Runnable接口publicinterfaceRunnablepublicabstractvoidrun();CallablepublicinterfaceCallable<V>Vcall()throwsException;runnable接口Callable接口都可以被ThreadPoolExecutor或ScheduledThr 查看详情

linkedhashset浅析(代码片段)

LinkedHashSet浅析LinkedHashSet的继承linkedhashset继承了hashset,并实现了可克隆和可序列化publicclassLinkedHashSet<E>extendsHashSet<E>implementsSet<E>,Cloneable,java.io.Serializable LinkedHashSet的构造方 查看详情

busybox浅析(代码片段)

title:busybox(一)浅析tag:armdate:2018-11-1323:02:33---busybox浅析源码包在busybox-1.7.0.tar.bz2,一个命令对应着一个c文件,执行init命令,则是有init.c,有函数init_mainintinit_main(intargc,char**argv);最终的目的是启动客户的应用程序,需要指定具体的... 查看详情

kernel源码浅析(代码片段)

目录kernel(二)源码浅析建立工程启动简析head.s入口点查询处理器查询机器ID启动MMU其他操作start_kernel处理命令行分区title:kernel(二)源码浅析tags:linuxdate:2018-11-0818:02:34---kernel(二)源码浅析建立工程移除所有Arch,添加Arch/arm下除了Mach_xxx... 查看详情

springboot自动配置原理浅析(代码片段)

springboot自动配置原理浅析springboot版本2.5.5注解@SpringBootApplication的源码:@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@E 查看详情

flinkflink1.12.2源码浅析:task浅析(代码片段)

1.概述转载:Flink1.12.2源码浅析:Task浅析Task表示TaskManager上并行subtask的一次执行。Task封装了一个Flinkoperator(也可能是一个用户function)并运行它,提供使用输入数据、生成结果(中间结果分区)和与JobManager... 查看详情