共计 3653 个字符,预计需要花费 10 分钟才能阅读完成。
关于 mydumper 的简介和下载请访问:https://launchpad.net/mydumper
简言之,mydumper 是多线程逻辑备份,对于表和数据量很大的情况下,建议使用 mydumper 提高备份效率,比 MySQLdumper 要快很多。
我为什么要用 mydumper?是基于某个需求,比如我需要把某个库下的所有按日期分表的表备份并导入到新实例?如何实现?
table_20170101
table_20170102
……
table_20171231
一共三百多张表开始我去尝试 mysqldump,看到参数:-B [table1,table2……table n] , 多么厚颜无耻的说咱支持多个指定表备份,5 个以下完全接受,但是我要备份 1000 个表,你要让我在那列 1000 个吗?我始终不相信,mysqldump 怎么能不支持表名模糊匹配呢?于是我就使用下面的写法:
mysqldump -uxx -p -B xx table_* > backup.sql 执行没有报错,惊喜,我就说嘛,怎么能不支持表的模糊匹配呢!!当我打开 backup.sql 文件时,膀胱都气炸了,尼玛直接备份了某个数据库下所有的表了。忽视我的模糊匹配嘛。从此对 mysqldump 没有好印象了,(当然也可能是我能力有限,还没有找到 mysqldump 的多表备份方式)。
转投 mydumper,当我看到 - x 参数时,又是一喜!看看人家,写的多么清晰,于是开始使用:
一、mydumper 安装:
# yum install glib2-devel mysql-devel zlib-devel pcre-devel
# wget http://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz
# tar zxvf mydumper-0.9.1.tar.gz -C ../software/
# cmake .
# make
# make install 二、使用 mydumper
1、刚用时报错:
/usr/local/bin/myloader: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory 解决方法:
# locate libmysqlclient.so.18
/usr/local/mysql/lib/libmysqlclient.so.18
/usr/local/mysql/lib/libmysqlclient.so.18.1.0
# echo “/usr/local/mysql/lib” >> /etc/ld.so.conf
# ldconfig 2、重要参数介绍:
-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 输出文件介绍:
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 指向该备份。
3、用例
# 将某个库下日表备份
mydumper -x “new_broker.broker_action_log_*” -o /data/dbbackup/tmp/ –host=’xxxx’ –user=’xxxx’ –password=’xxx’ –port=’3306′ –logfile=’/data/dbbackup/tmp/mydumper.log’ –threads=6 -v 3
# 将备份数据恢复到新数据库 broker_biz_log 中
myloader -t 6 -v 3 –host=’xxxx’ –user=’xxxx’ –password=’xxxx’ –port=’3306′ -B broker_biz_log –directory=’/data/dbbackup/tmp’ 4、使用误区
需求 1:备份多个数据库下所有表
【错误案例,有部分库导出失败】
nohup mydumper -x “(test_db.*)|(test.*)|(mysql.*)” -o /data/dbbackup/mydumper/ –host=’192.168.1.20′ –user=’secret’ –password=’xx’ –port=’3306′ –logfile=’/data/dbbackup/mydumper/mydumper.log’ –threads=6 -v 3 &【正确的写法】
nohup mydumper -x “(test_db|test|mysql).*” -o /data/dbbackup/mydumper/ –host=’192.168.1.20′ –user=’secret’ –password=’xx’ –port=’3306′ –logfile=’/data/dbbackup/mydumper/mydumper.log’ –threads=6 -v 3 & 需求 2:备份所有数据库下所有表
mydumper -o /data/dbbackup/mydumper/ –host=’ip’ –user=’secret’ –password=’xx’ –port=’3306′ –logfile=’/data/dbbackup/mydumper/mydumper.log’ –threads=6 -v 3[myloader]
– 将 /data/dbbackup/mydumper 上的所有库都恢复
【正确的写法】
nohup myloader -t 6 -v 3 -u secret -p xxx -S /tmp/mysql.sock –directory=’/data/dbbackup/mydumper’ &【值得注意的是:myloader 是以. 为分隔符来截取库名的,所以如果本身库的名字中包含. 的,那么会失败】
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-02/141125.htm