简介:
Mydumper、Myloader 是一个第三方的、开源的 MySQL 逻辑备份工具。
支持多线程,比起 mysqldump 要快很多,也能解决 innobackupex 备份工具对 MyISAM 引擎备份的不便。
多线程快速逻辑备份,恢复速度不咋地,支持快照功能。
呃,虽然这样好、那样好,但如果单库、又很大的时候,备份还是选择 innobackupex 物理备份吧,速度就是快。
一、安装 Mydumper
shell > yum -y install gcc gcc-c++ glib2-devel pcre-devel zlib-devel mysql-devel
shell > cd /usr/local/src; wget https://launchpad.net/mydumper/0.9/0.9.1/+download/mydumper-0.9.1.tar.gz
shell > tar zxf mydumper-0.9.1.tar.gz
shell > cd mydumper-0.9.1
shell > cmake . && make && make install
shell > /usr/local/bin/mydumper --help
/usr/local/bin/mydumper: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
shell > find / -name "libmysqlclient.so.18"
/usr/local/src/mysql-5.5.52/libmysql/libmysqlclient.so.18
/usr/local/mysql-5.5.52/lib/libmysqlclient.so.18
shell > ln -s /usr/local/mysql-5.5.52/lib/libmysqlclient.so.18 /usr/lib64/
二、Mydumper 全备
shell > /usr/local/bin/mydumper --help
-B, --database 指定备份的数据库,不指定时为备份全库(除 information_schema、performance_schema)
-T, --tables-list 指定备份的表,逗号分隔
-o, --outputdir 指定备份目录
-c, --compress 压缩备份输出
-e, --build-empty-files 即使表中无数据也备份成一个文件
-x, --regex 支持正则表达式 db.table,如 --regex '^(?!(mysql|test))' 不备份 mysql、test 库
-m, --no-schemas 不备份表结构
-d, --no-data 不备份数据
-G, --triggers 备份 triggers
-E, --events 备份 events
-R, --routines 备份存储过程跟函数
-k, --no-locks 不适用共享读锁,会导致数据不一致
-D, --daemon 以守护进程的方式启动
-I, --snapshot-interval 快照间隔时间,默认 60 秒
-h, --host
-u, --user
-p, --password
-P, --PORT
-S, --socket
-t, --threads 启动几个线程,默认 4
-C, --compress-protocol MySQL 连接上使用压缩协议,建议远程备份时使用
... 还有一些不常用的指令 通过 --help 获取
shell > /usr/local/bin/mydumper -u xxxx -p xxxx -e -c -B db_xxx -o /data/backup_db/2017-07/db_xxx_05 # 目录 db_xxx_05 会自动创建
shell > ls -1 /data/backup_db/2017-07/db_xxx_05
db_xxx-schema-create.sql.gz
db_xxx.table_1.sql.gz
db_xxx.table_1-schema.sql.gz
...
metadata
# 备份目录下会生成如上几种类型的文件,可以使用 gunzip 解压后读取、分析
# db_xxx-schema-create.sql.gz 备份的数据库创建语句,也就是说恢复时不需要事先创建数据库
# db_xxx.table_1.sql.gz 数据表数据文件
# db_xxx.table_1-schema.sql.gz 数据表结构文件
shell > cat /data/backup_db/2017-07/db_xxx_05/metadata
Started dump at: 2017-07-05 14:57:56
SHOW MASTER STATUS:
Log: mysql-bin.000024
Pos: 760137384
GTID:(null)
Finished dump at: 2017-07-05 15:01:20
# metadata 记录了备份时刻的 MASTER 信息(如果备份的是从库,还会记录 SLAVE STATUS),备份开始时间、结束时间
三、Myloader 全备恢复
shell > /usr/local/bin/myloader --help
-d, --directory 指定备份数据存放目录
-o, --overwarite-tables 如表存在,则覆盖写入
-B, --database 指定恢复的数据库
-s, --source-db
-e, --enable-binlog
-h, --host
-u, --user
-p, --password
-P, --PORT
-S, --socket
-t, --threads
-C, --compress-protocol
...
shell > /usr/local/bin/myloader -u xxxx -p xxxx -B db_xxx -d /data/backup_db/2017-07/db_xxx_05
# 这是恢复单库到一个新的 MySQL(不需要提前创建数据库),不指定 -B 时,恢复备份中的所有数据
# 恢复单表时,解压后直接 source .sql 即可
# 恢复到原库时,需要添加 -o 参数,覆盖写入
# 机器性能允许的情况下,添加 -t 参数,开启多个并行线程恢复
四、如何加快恢复速度 ?
shell > mysql -u xxxx -p xxxx
mysql > show processlist;
| 26 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_tj_sinideo` VALUES
|
| 27 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_alum_kwords` VALUES
| 28 | root | localhost | baofeng_tv | Query | 1 | update | INSERT INTO `std_epode_qyi` VALUES
| 29 | root | localhost | baofeng_tv | Query | 2 | update | INSERT INTO `std_alum_stams` VALUES
# 默认情况下,可以看到有 4 个线程在插入数据,一个线程负责一张表,执行完换下一张 ( myloader -u -p -B -d )
# 19G 的数据库恢复了 82分22秒,简直不能忍
shell > /usr/local/bin/mydumper -u root -c -e -B baofeng_tv -F 500 -o /data/backup_db/baofeng_tv_06 -t 8
shell > /usr/local/bin/myloader -u root -B baofeng_tv -o -d /data/backup_db/baofeng_tv_06 -t 8
# -F 按大小拆分备份,恢复的时候也并没什么效果,备份速度挺快,恢复不咋地!
# 那个,快照咋搞 ?