【mysql】mydumper多线程备份恢复

来源:互联网 发布:淘宝的聚划算怎么用 编辑:程序博客网 时间:2024/04/30 00:03

一、简介

使用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 maketar zxvf mydumper-0.6.2.tar.gzcd mydumper-0.6.2cmake .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

mysqldumper6.jpg

Mydumper(8个线程)

mysqldumper7.jpg

2、单个表测试

Mysqldump

mysqldumper8.jpg

Mydumper

mysqldumper9.jpg

3、恢复:

Mysqldump

Mydumper 无trunk:

Trunk 20M分割babysitter_order表成5个:

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

Mysqldump系统性能消耗

Mydumper系统性能消耗

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

0 0
原创粉丝点击