使用mydumper多线程备份MySQL数据库

 更新时间:2013年11月15日 15:33:46   投稿:zxhpj  
MySQL在备份方面包含了自身的mysqldump工具,但其只支持单线程工作,这就使得它无法迅速的备份数据。而 mydumper作为一个实用工具,能够良好支持多线程工作,这使得它在处理速度方面十倍于传统的

mysqldump:其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞。但一般现在的MySQL都有主从,备份也大部分在从上进行,所以锁的问题可以不用考虑。这样,mydumper能更好的完成备份任务。
Mydumper主要特性:是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具,开发人员主要来自MySQL,Facebook,SkySQL公司。

复制代码 代码如下:

1:轻量级C语言写的
    2:执行速度比mysqldump快10倍
    3:事务性和非事务性表一致的快照(适用于0.2.2以上版本)
    4:快速的文件压缩
    5:支持导出binlog
    6:多线程恢复(适用于0.2.1以上版本)
    7:以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
    8:开源 (GNU GPLv3)

下载安装:环境:Ubuntu 12.04

复制代码 代码如下:

wget https://launchpad.net/mydumper/0.5/0.5.2/+download/mydumper-0.5.2.tar.gz

安装:解压后,有安装说明

复制代码 代码如下:

apt-get install libglib2.0-dev libmysqlclient15-dev zlib1g-dev libpcre3-dev g++
cmake .
make

复制代码 代码如下:

root@dd:~/mydumper-0.5.2# cmake .
-- The CXX compiler identification is GNU
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Using mysql-config: /usr/bin/mysql_config
-- Found MySQL: /usr/include/mysql, /usr/lib/x86_64-linux-gnu/libmysqlclient_r.so;/usr/lib/x86_64-linux-gnu/libpthread.so;/usr/lib/x86_64-linux-gnu/libz.so;/usr/lib/x86_64-linux-gnu/libm.so;/usr/lib/x86_64-linux-gnu/librt.so;/usr/lib/x86_64-linux-gnu/libdl.so

CMake Warning at docs/CMakeLists.txt:9 (message):
  Unable to find Sphinx documentation generator


-- ------------------------------------------------
-- MYSQL_CONFIG = /usr/bin/mysql_config
-- CMAKE_INSTALL_PREFIX = /usr/local
-- BUILD_DOCS = ON
-- RUN_CPPCHECK = OFF
-- Change a values with: cmake -D<Variable>=<Value>
-- ------------------------------------------------
--
-- Configuring done
-- Generating done
-- Build files have been written to: /root/mydumper-0.5.2
root@dd:~/mydumper-0.5.2# make
Scanning dependencies of target mydumper
[ 20%] Building C object CMakeFiles/mydumper.dir/mydumper.c.o
[ 40%] Building C object CMakeFiles/mydumper.dir/binlog.c.o
[ 60%] Building C object CMakeFiles/mydumper.dir/server_detect.c.o
[ 80%] Building C object CMakeFiles/mydumper.dir/g_unix_signal.c.o
Linking C executable mydumper
[ 80%] Built target mydumper
Scanning dependencies of target myloader
[100%] Building C object CMakeFiles/myloader.dir/myloader.c.o
Linking C executable myloader
[100%] Built target myloader

生成2个工具:mydumper(备份),myloader(导入)

参数:
mydumper:

复制代码 代码如下:

root@dd:~/mydumper-0.5.2# ./mydumper --help
Usage:
  mydumper [OPTION...] multi-threaded MySQL dumping

Help Options:
  -?, --help                  Show help options

Application Options:
  -B, --database              需要备份的库
  -T, --tables-list           需要备份的表,用逗号分隔
  -o, --outputdir             输出文件的目录
  -s, --statement-size        生成语句的字节数, 默认 1000000
  -r, --rows                  分成很多行块表
  -c, --compress              压缩输出文件
  -e, --build-empty-files     即使表没有数据,还是产生一个空文件
  -x, --regex                 正则表达式: 'db.table'
  -i, --ignore-engines        忽略的存储引擎,用逗号分隔
  -m, --no-schemas            不导出表结构
  -k, --no-locks              不执行共享读锁 警告:这将导致不一致的备份
  -l, --long-query-guard      设置长查询时间,默认60秒
  --kill-long-queries         kill掉长时间执行的查询
  -b, --binlogs               导出binlog
  -D, --daemon                启用守护进程模式
  -I, --snapshot-interval     dump快照间隔时间,默认60s,需要在daemon模式下
  -L, --logfile               日志文件
  -h, --host                  The host to connect to
  -u, --user                  Username with privileges to run the dump
  -p, --password              User password
  -P, --port                  TCP/IP port to connect to
  -S, --socket                UNIX domain socket file to use for connection
  -t, --threads               使用的线程数,默认4
  -C, --compress-protocol     在mysql连接上使用压缩协议
  -V, --version               Show the program version and exit
  -v, --verbose               更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

myloader:

复制代码 代码如下:

root@dd:~/mydumper-0.5.2# ./myloader --help
Usage:
  myloader [OPTION...] multi-threaded MySQL loader

Help Options:
  -?, --help                        Show help options

Application Options:
  -d, --directory                   备份文件所在的目录
  -q, --queries-per-transaction     每次执行查询数量, 默认1000
  -o, --overwrite-tables            如果表存在则先删除。这里注意下,使用该参数,需要备份时候要备份表结构,不然会出问题
  -B, --database                    需要还原的数据库
  -e, --enable-binlog               启用二进制恢复数据
  -h, --host                        The host to connect to
  -u, --user                        Username with privileges to run the dump
  -p, --password                    User password
  -P, --port                        TCP/IP port to connect to
  -S, --socket                      UNIX domain socket file to use for connection
  -t, --threads                     使用的线程数量,默认4
  -C, --compress-protocol           连接上使用压缩协议
  -V, --version                     Show the program version and exit
  -v, --verbose                     更多输出, 0 = silent, 1 = errors, 2 = warnings, 3 = info, default 2

测试:测试基本用法

1:备份

复制代码 代码如下:

./mydumper -u zjy -p ##### -h 192.168.220.245 -P 3306 -B chushihua -o /home/zhoujy/bak/

备份analyzedxy数据库到/home/zhoujy/bak/ 目录中,查看是否多线程:

复制代码 代码如下:

| 4937639 | zjy  | 192.168.200.25:34781  | NULL| Query   |      0 | NULL              | show processlist |
| 4937677 | zjy  | 192.168.200.25:34791  | NULL| Query   |     10 | Writing to net    | SELECT /*!40001 SQL_NO_CACHE */|
| 4937678 | zjy  | 192.168.200.25:34792  | NULL| Query   |      5 | Writing to net    | SELECT /*!40001 SQL_NO_CACHE */ |
| 4937679 | zjy  | 192.168.200.25:34793  | NULL| Query   |     10 | Writing to net    | SELECT /*!40001 SQL_NO_CACHE */ |
| 4937680 | zjy  | 192.168.200.25:34794  | NULL| Query   |     10 | Writing to net    | SELECT /*!40001 SQL_NO_CACHE */ |

上面显示确实是4个线程(默认)在备份,查看备份文件:

复制代码 代码如下:

root@zhoujy:/home/zhoujy/bak# ls -lh
-rw-r--r-- 1 root root  322 2013-11-14 17:59 chushihua.dba_hospital_all_name-schema.sql
-rw-r--r-- 1 root root  16M 2013-11-14 17:59 chushihua.dba_hospital_all_name.sql
-rw-r--r-- 1 root root  221 2013-11-14 17:59 chushihua.dba_hospital-schema.sql
-rw-r--r-- 1 root root  658 2013-11-14 17:59 chushihua.dba_hospital.sql
-rw-r--r-- 1 root root  198 2013-11-14 17:59 chushihua.dba_jobTitle-schema.sql
-rw-r--r-- 1 root root  300 2013-11-14 17:59 chushihua.dba_jobTitle.sql
-rw-r--r-- 1 root root  261 2013-11-14 17:59 chushihua.dba_locatedCity-schema.sql
-rw-r--r-- 1 root root 202K 2013-11-14 17:59 chushihua.dba_locatedCity.sql

分析:mydumper把数据和表结构分开备份,并且把二进制日志备份出来单独放到一个文件中。

复制代码 代码如下:

metadata:元数据 记录备份开始和结束时间,以及binlog日志文件位置。
table data:每个表一个文件
table schemas:表结构文件
binary logs: 启用--binlogs选项后,二进制文件存放在binlog_snapshot目录下
daemon mode:在这个模式下,有五个目录0,1,binlogs,binlog_snapshot,last_dump。
备份目录是0和1,间隔备份,如果mydumper因某种原因失败而仍然有一个好的快照,当快照完成后,last_dump指向该备份。

2:还原:还原到另一台服务器,先建立要还原的数据库(chushihua)

和备份一样查看是否多线程:

复制代码 代码如下:

| 19 | root        |      | NULL      | Query   |     0 | init  | show   processlist|
| 30 | root        |      | chushihua | Query   |     5 | update| INSERT INTO       |
| 31 | root        |      | chushihua | Query   |     5 | update| INSERT INTO       |
| 32 | root        |      | chushihua | Query   |     5 | update| INSERT INTO       |
| 33 | root        |      | chushihua | Query   |     5 | update| INSERT INTO       |

上面显示确实是4个线程(默认)在还原。
进一步测试:测试一些常用的参数
1):备份指定表(-T),并且不要导出表结构(-m)

zhoujy@zhoujy:~/bak$ ls -lh
-rw-rw-r-- 1 zhoujy zhoujy 3.4K 2013-11-14 20:57 test.a.sql
-rw-rw-r-- 1 zhoujy zhoujy 1.6M 2013-11-14 20:57 test.b.sql
-rw-rw-r-- 1 zhoujy zhoujy 7.8M 2013-11-14 20:57 test.c.sql
-rw-rw-r-- 1 zhoujy zhoujy 1.7M 2013-11-14 20:57 test.d.sql
-rw-rw-r-- 1 zhoujy zhoujy 303K 2013-11-14 20:57 test.e.sql
-rw-rw-r-- 1 zhoujy zhoujy 517K 2013-11-14 20:57 test.f.sql
-rw-rw-r-- 1 zhoujy zhoujy 646K 2013-11-14 20:57 test.g.sql
-rw-rw-r-- 1 zhoujy zhoujy 394K 2013-11-14 20:57 test.h.sql
-rw-rw-r-- 1 zhoujy zhoujy  34K 2013-11-14 20:57 test.i.sql
-rw-rw-r-- 1 zhoujy zhoujy   75 2013-11-14 20:57 metadata
[/code]

 2)压缩备份文件(-c),备份binlog(-b),正则表达式备份表(-x)

drwx------ 2 zhoujy zhoujy 4.0K 2013-11-14 21:16 binlog_snapshot
-rw-rw-r-- 1 zhoujy zhoujy  133 2013-11-14 21:16 metadata
-rw-rw-r-- 1 zhoujy zhoujy  94K 2013-11-14 21:16 test.tmp_0808.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy  75K 2013-11-14 21:16 test.tmp_0809.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy  25K 2013-11-14 21:16 test.tmp_0813.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 208K 2013-11-14 21:16 test.tmp_0826.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy  915 2013-11-14 21:16 test.tmp_0827.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy  901 2013-11-14 21:16 test.tmp_0912.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 2.1K 2013-11-14 21:16 test.tmp_0916.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy 622K 2013-11-14 21:16 test.tmp_0918_a.sql.gz
-rw-rw-r-- 1 zhoujy zhoujy  28M 2013-11-14 21:16 test.tmp_0918_ff.sql.gz
 [/code]

如上所示,备份文件已经是压缩的了(用gzip -d 解压),并且备份出了tmp.*匹配出来的所有表,二进制日志也被备份到了binlog_snapshot文件中,并且也是被压缩的。
3)还原,表存在先删除(-o):这里需要注意,使用该参数,备份目录里面需要有表结构的备份文件。

更多的参数效果,请自己测试。
最后测试:用mysqldump和mydumper进行对比测试。

复制代码 代码如下:

#!/usr/bin/env python
#coding=utf-8
import MySQLdb
import os
import sys
import time

backup = os.system('')

def mysqldump_data():
    t1 = time.time()
    backup = os.system('mysqldump --no-defaults -uroot -p123456 -h192.168.200.25 --default-character-set=utf8 test > /home/zhoujy/test.bak')
    t2 = time.time()
    t = round(t2-t1)
    print "mysqldump Cost Time %s" %t

if __name__ =='__main__':
    mysqldump_data()
    mydumper_data()

测试了2个数据库:

1:

mysqldump Cost Time :162s
mydumper Cost Time :61s

2:

mysqldump Cost Time :483s
mydumper Cost Time :337s

从上面的时间来看,mydumper 确实提升了备份数据,还原也同理。

总结:
从上面的测试分析中看出mydumper可以提升备份还原的效率,提升多少受限于磁盘的IO能力,在使用前做好磁盘IO的评估,大家可以尝试使用该工具。

相关文章

  • 探究MySQL优化器对索引和JOIN顺序的选择

    探究MySQL优化器对索引和JOIN顺序的选择

    这篇文章主要介绍了探究MySQL优化器对索引和JOIN顺序的选择,包括在优化器做出错误判断时的选择情况,需要的朋友可以参考下
    2015-05-05
  • 解决mysql输入密码闪退的问题

    解决mysql输入密码闪退的问题

    之前安装的mysql一直运行正常,但是在昨天装了个VS2010旗舰版。结果今天mysql就不能用了,于是在网上看了一下最只要就是mysql的服务没有起来的缘故。本文分享了几个解决方案,有需要的朋友们可以参考借鉴,下面来一起看看吧。
    2016-11-11
  • mysql数据库远程访问设置方法

    mysql数据库远程访问设置方法

    MySQL数据库不允许从远程访问怎么办?本文提供了三种解决方法,需要的朋友可以参考下
    2008-02-02
  • 浅谈MySQL 亿级数据分页的优化

    浅谈MySQL 亿级数据分页的优化

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下。本文就来介绍一下MySQL 亿级数据分页的优化,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • mysql如何修改表结构(alter table),多列/多字段

    mysql如何修改表结构(alter table),多列/多字段

    这篇文章主要介绍了mysql如何修改表结构(alter table),多列/多字段问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • mysql数据库迁移数据目录至另一台服务器详细步骤

    mysql数据库迁移数据目录至另一台服务器详细步骤

    MySQL数据库转移到新服务器是指将现有的MySQL数据库迁移至一个新的服务器环境中,下面这篇文章主要给大家介绍了关于mysql数据库迁移数据目录至另一台服务器的详细步骤,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • mysql实现设置定时任务的方法分析

    mysql实现设置定时任务的方法分析

    这篇文章主要介绍了mysql实现设置定时任务的方法,结合实例形式分析了mysql定时任务相关的事件计划设置与存储过程使用等操作技巧,需要的朋友可以参考下
    2019-10-10
  • MySql安装与配置方法(MySQL添加用户、删除用户与授权)

    MySql安装与配置方法(MySQL添加用户、删除用户与授权)

    这篇文章主要介绍了MySql安装与配置方法(MySQL添加用户、删除用户与授权)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • MySQL使用SHOW PROCESSLIST的实现

    MySQL使用SHOW PROCESSLIST的实现

    本文主要介绍了MySQL使用SHOW PROCESSLIST的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • Mysql查询数据库连接状态以及连接信息详解

    Mysql查询数据库连接状态以及连接信息详解

    这篇文章主要给大家介绍了关于Mysql查询数据库连接状态以及连接信息的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-04-04

最新评论