mysqldump是mysql官方自带的备份工具,是一个很好用的mysql数据转移工具,具备兼容强强、跨版本等特色mysql
mydumper是一个针对MySQL的高性能多线程备份和恢复工具,它提供了并发备份功能,备份效率有很大提升,而且按照单表进行备份,表恢复更加方便。c++
mydumper主要特性有:正则表达式
• 轻量级C语言写的sql
• 执行速度比mysqldump快10倍数据库
• 事务性和非事务性表一致的快照(适用于0.2.2以上版本)多线程
• 快速的文件压缩并发
• 支持导出binlogsocket
• 多线程恢复(适用于0.2.1以上版本)工具
• 以守护进程的工做方式,定时快照和连续二进制日志(适用于0.5.0以上版本)性能
• 开源 (GNU GPLv3)
本文将对两个工具进行简单的对比测试,并给出参考结果。
因为mysqldump使用较多,比较熟悉,因此这里主要介绍mydumper的安装使用。
Mydumper下载地址:https://launchpad.net/mydumper,最新的稳定版本是0.6.2,下载以后按照以下方式安装:
1 # yum install glib2-devel mysql-devel zlib-devel pcre-devel gcc-c++ 2 # wget http://launchpad.net/mydumper/0.6/0.6.2/+download/mydumper-0.6.2.tar.gz 3 # tar zxvf mydumper-0.6.2.tar.gz 4 # cd mydumper-0.6.2 5 # cmake . 6 # make 7 # make install
mydumper安装完成以后包括导出的mydumper工具和导入的myloader,主要参数以下:
mydumper参数介绍: -B, --database 须要备份的库 -T, --tables-list 须要备份的表,用,分隔 -o, --outputdir 输出目录 -s, --statement-size Attempted size of INSERT statement in bytes, default 1000000 -r, --rows 试图分裂成不少行块表 -c, --compress 压缩输出文件 -e, --build-empty-files 即便表没有数据,仍是产生一个空文件 -x, --regex 支持正则表达式 -i, --ignore-engines 忽略的存储引擎,用,分隔 -m, --no-schemas 不导出表结构 -k, --no-locks 不执行临时共享读锁 警告:这将致使不一致的备份 -l, --long-query-guard 长查询,默认60s --kill-long-queries kill掉长时间执行的查询(instead of aborting) -b, --binlogs 导出binlog -D, --daemon 启用守护进程模式 -I, --snapshot-interval dump快照间隔时间,默认60s,须要在daemon模式下 -L, --logfile 日志文件 -h, --host -u, --user -p, --password -P, --port -S, --socket -t, --threads 使用的线程数,默认4 -C, --compress-protocol 在mysql链接上使用压缩 -V, --version -v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2 myloader参数介绍: -d, --directory 导入备份目录 -q, --queries-per-transaction 每次执行的查询数量, 默认1000 -o, --overwrite-tables 若是表存在删除表 -B, --database 须要还原的库 -e, --enable-binlog 启用二进制恢复数据 -h, --host -u, --user -p, --password -P, --port -S, --socket -t, --threads 使用的线程数量,默认4 -C, --compress-protocol 链接上使用压缩 -V, --version -v, --verbose 更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2
mydumper备份时须要指定一个备份目录,不能像mysqldump同样备份整个库指定到某个特定的sql文件:
1 mydumper -u root -p ${MYSQLPASSWD} -B ${DB_NAME} -o ${BACKUPDIR} -t 4
导出的文件以下图所示:
每一个代表后接schema的sql文件的是表结构文件,另外一个是表数据,若是表没有数据默认只有一个schema的文件,能够加上-e参数强制生成一个空的数据文件。若是加上-c参数就会对每一个导出的文件进行压缩打包,以下图所示:
1 myloader -u root -p ${MYSQLPASSWD} -d ${BACKUPDIR} -o -B ${DB_NAME}
测试方式:分别采用mysqldump分表备份方式和mydumper的方式,mydumper默认4个线程,对单个或多个库进行备份,主要观察备份时间以及备份期间机器的CPU使用状况。
对单个数据库进行备份状况,默认采用4个线程同时备份:
|
200M |
4G |
7G |
30G |
mysqldump |
8s |
2m58s |
5m50s |
13m13s |
mydumper |
4s |
1m38s |
2m56s |
7m59s |
对多个数据库连续备份,总共约8G大小的库
方式 |
时间 |
mysqldump |
5m14s |
mydumper |
2m05s |
在测试过程当中,观察机器的CPU使用状况,采用mysqldump的CPU使用约在98%左右,采用mydumper的状况下CPU使用约在200%-400%之间。因此对于消耗CPU的游戏来讲,采用mydumper无疑会增大CPU消耗负担,而且可能对游戏产生影响,因此并不太建议采用mydumper,而若是是专门的数据库而且CPU较为空闲的状况,能够采用,适当增多线程数,能够更快的完成备份。
另外在标配的单盘的机器上测试的时候发下,线程数设置为2的时候的时候,IO已经跑满了,相对于线程数为1的时候速度有显著提高,可是在IO跑满以后,设置线程数为四、八、10,线程数越大,CPU消耗会越大,可是对整个备份时间并无太大影响了,因此在cpu足够空闲的状况下,IO是影响mydumper性能的瓶颈所在,使用的时候根据实际IO状况合理设置线程数。