使用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个(线程数可以指定,默认是4) 3、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