【mysql】mydumper多线程备份恢复

一、简介

使用C语言开发的Mysql备份工具,开发人员主要来自MySQL,Facebook,SkySQL公司。备份速度理论值比mysqldump快10倍,支持多线程备份,mysqldump是单线程备份。这也使它在处理速度要快很多。其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞。一般有主从结构的情况下,可以在从库进行备份。因为是多线程逻辑备份,备份后会生成多个备份文件。

二、特性

1、多线程备份 
2、因为是多线程逻辑备份
3、备份后会生成多个备份文件 
4、备份时对MyISAM表施加FTWRL(FLUSH TABLES WITH READ LOCK),会阻塞DML语句 保证备份数据的一致性 
5、支持文件压缩 
6、支持导出binlog 
7、支持多线程恢复 
8、支持以守护进程模式工作
9、定时快照和连续二进制日志 
10、支持将备份文件切块

三、工作流程图

四、备份文件

每个表有两个备份文件,如果对表文件分片,将生成多个备份数据文件,可以指定行数或指定大小分片。

1、database.table-schema.sql 表结构文件
2、database.table.sql 表数据文件
3、metadata  字典信息文件,记录了备份数据库在备份时间点的二进制日志文件名,日志的写入位置,如果是在从库进行备份,还会记录备份时同步至主库的二进制日志文件及写入位置

五、锁表

经过测试发现mydumper在执行过程中会加一个全局读锁,保证myisam的数据一致性,当myisam数据备份完成后,释放锁开始备份innodb表。

六、恢复的步骤

默认模式:
1、主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,以阻止DML语句写入,保证数据的一致性
2、读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用 N个(线程数可以指定,默认是43、dump线程 
4、START TRANSACTION WITH CONSISTENT SNAPSHOT; 开启读一致的事物 
5、dump non-InnoDB tables, 首先导出非事物引擎的表 
6、主线程 UNLOCK TABLES 非事物引擎备份完后
7、释放全局只读锁 
8、dump InnoDB tables, 基于事物导出InnoDB表 
9、事物结束

less locking模式:

mydumper使用--less-locking可以减少锁等待时间,此时mydumper的执行机制大致为
 
1、	主线程 FLUSH TABLES WITH READ LOCK (全局锁) 
2、	Dump线程 
3、	START TRANSACTION WITH CONSISTENT SNAPSHOT; 
4、	LL Dump线程 LOCK TABLES non-InnoDB (线程内部锁) 
5、	主线程UNLOCK TABLES LL Dump线程 
6、	dump non-InnoDB tables LL DUmp线程 
7、	UNLOCK non-InnoDB Dump线程 
8、	dump InnoDB tables

七、安装

mydumper使用c语言编写,使用glibc库 mydumper安装所依赖的软件包,glibc, glibc-devel, zlib,zlibdevel, pcre, pcre-devel, gcc, gcc-c++, cmake, make, mysql客户端库文件

yum –y install glibc zlib zlibdevel pcre pcre-devel gcc  gcc-c++ cmake make
tar zxvf mydumper-0.6.2.tar.gz
cd mydumper-0.6.2
cmake .
make && make install

安装完成后会生成mydumper和myloader两个二进制文件

八、备份

mydumper -B babysitter --threads 3 -F 20 -o /root/chen/dbbackup/babysitternew/
 
-B 备份的数据库名
--threads 几个线程备份
-F 使用多大的trunk分割表,默认单位M
-o 备份的目录

当一个库中有一个大表可以用trunk的方式进行分割,这样恢复的时候可以使用多线程恢复来减少恢复时间。

九、恢复

Mydumper备份出来的文件需用myloader恢复,安装完mydumper就会有。

myloader -B babysitter1 -o -t 3 -d /root/chen/dbbackup/babysitternew/
 
-B 恢复的数据库名
-o 如果表存在则删除
-t 恢复数据库的线程数
-d 恢复备份的目录	

十、测试

测试mysqldump和mydumper的备份性能

机器配置 CPU: Intel(R) Xeon(R) CPU E5506 @ 2.13GHz * 8核 内存:32G

1,多表测试

库大小:2269M 表个数:1169

Mysqldump

Mydumper(8个线程)

2、单个表测试

Mysqldump

Mydumper

3、恢复:

Mysqldump

Mydumper 无trunk:

Trunk 20M分割babysitter_order表成5个:

结论:数据库中多个表使用mydumper备份恢复性能提高明显

Mysqldump系统性能消耗

Mydumper系统性能消耗

结论:可以看出mydumper因为使用多线程备份恢复,总体性能消耗要高于mysqldump

你可能感兴趣的:(mysql)