简介:

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 按大小拆分备份,恢复的时候也并没什么效果,备份速度挺快,恢复不咋地!

# 那个,快照咋搞 ?