使用mydumper多线程备份MySQL数据库 |
mysqldump:其特征之一是在处理过程中需要对列表加以锁定,因此如果我们需要在工作时段执行备份工作,那么会引起DML阻塞 。但一般现在的MySQL都有主从,备份也大部分在从上进行,所以锁的问题可以不用考虑 。这样,mydumper能更好的完成备份任务 。 复制代码 代码如下: 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):
生成2个工具:mydumper(备份),myloader(导入) 参数: 复制代码 代码如下: root@dd:'/mydumper-0.5.2# ./mydumper --help Usage: mydumper [OPTION...] multi-threaded MySQL dumping Help Options: Application Options: myloader: 复制代码 代码如下: root@dd:'/mydumper-0.5.2# ./myloader --help Usage: myloader [OPTION...] multi-threaded MySQL loader Help Options: Application Options: 测试:测试基本用法 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) 复制代码 代码如下: ./myloader -u root -p 123456 -h 192.168.200.25 -P 3307 -B chushihua -d /home/zhoujy/bak/ 和备份一样查看是否多线程: 复制代码 代码如下: | 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个线程(默认)在还原 。 复制代码 代码如下: ./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 2)压缩备份文件(-c),备份binlog(-b),正则表达式备份表(-x)
复制代码 代码如下: ./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 如上所示,备份文件已经是压缩的了(用gzip -d 解压),并且备份出了tmp.*匹配出来的所有表,二进制日志也被备份到了binlog_snapshot文件中,并且也是被压缩的 。 复制代码 代码如下: ./myloader -u root -p 123456 -h 192.168.200.25 -P 3306 -o -B test -d /home/zhoujy/bak/ 更多的参数效果,请自己测试 。 复制代码 代码如下: #!/usr/bin/env python #coding=utf-8 import MySQLdb import os import sys import time backup = os.system() def mysqldump_data(): def mydumper_data(): if __name__ ==__main__: 测试了2个数据库: 1: mysqldump Cost Time :162s 2: mysqldump Cost Time :483s 从上面的时间来看,mydumper 确实提升了备份数据,还原也同理 。 总结: |