加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

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

发布时间:2020-12-12 00:54:50 所属栏目:MySql教程 来源:网络整理
导读:《MYSQL数据库使用mydumper多线程备份MySQL数据库》要点: 本文介绍了MYSQL数据库使用mydumper多线程备份MySQL数据库,希望对您有用。如果有疑问,可以联系我们。 mysqldump:其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备

《MYSQL数据库使用mydumper多线程备份MySQL数据库》要点:
本文介绍了MYSQL数据库使用mydumper多线程备份MySQL数据库,希望对您有用。如果有疑问,可以联系我们。

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

代码如下:
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.04MYSQL实例

代码如下:
wget https://launchpad.net/mydumper/0.5/0.5.2/+download/mydumper-0.5.2.tar.gz

安装:解压后,有安装说明MYSQL实例

代码如下:
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 generatorMYSQL实例


-- ------------------------------------------------
-- 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
MYSQL实例

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

参数:
mydumper:
MYSQL实例

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

Help Options:
? -?,--help????????????????? Show help optionsMYSQL实例

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
MYSQL实例

myloader:
MYSQL实例

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

Help Options:
? -?,--help??????????????????????? Show help optionsMYSQL实例

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???????????????????? 使用的线程数量,--compress-protocol?????????? 连接上使用压缩协议
? -V,--version???????????????????? Show the program version and exit
? -v,--verbose???????????????????? 更多输出,default 2
MYSQL实例

测试:测试基本用法MYSQL实例

1:备份
MYSQL实例

代码如下:
./mydumper -u zjy -p ##### -h 192.168.220.245 -P 3306 -B chushihua -o /home/zhoujy/bak/

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

代码如下:
| 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个线程(默认)在备份,查看备份文件:MYSQL实例

代码如下:
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把数据和表结构分开备份,并且把二进制日志备份出来单独放到一个文件中.MYSQL实例

代码如下:
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)MYSQL实例

代码如下:
./myloader -u root -p 123456 -h 192.168.200.25 -P 3307 -B chushihua -d /home/zhoujy/bak/

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

代码如下:
| 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)MYSQL实例

代码如下:
./mydumper -u root-p 123456 -h 192.168.220.252 -P 3306 -m -B test -T b,a,c,d,e,g,f,h,i -o /home/zhoujy/bak/

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
MYSQL实例

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

?MYSQL实例

代码如下:
?./mydumper -u root -p 123456 -h 192.168.200.25 -P 3306 -m -c -b --regex=tmp.* -B test? -o /home/zhoujy/bak/

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
?MYSQL实例

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

代码如下:
./myloader -u root -p 123456 -h 192.168.200.25 -P 3306 -o -B test -d /home/zhoujy/bak/

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

代码如下:
#!/usr/bin/env python
#coding=utf-8
import MySQLdb
import os
import sys
import time

backup = os.system('')MYSQL实例

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" %tMYSQL实例

def mydumper_data():
??? t1 = time.time()
??? backup = os.system('mydumper -u root -p 123456 -h 192.168.200.25 -P 3306 -B test -o /home/zhoujy/bak/')
??? t2 = time.time()
??? t = round(t2-t1)
??? print "mydumper Cost Time %s" %tMYSQL实例

if __name__ =='__main__':
??? mysqldump_data()
??? mydumper_data()
MYSQL实例

测试了2个数据库:MYSQL实例

1:MYSQL实例

mysqldump Cost Time :162s
mydumper Cost Time :61sMYSQL实例

2:MYSQL实例

mysqldump Cost Time :483s
mydumper Cost Time :337sMYSQL实例

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读